role Rational[::NuT, ::DeT] does Real { ... }
Rational
is the common role for numbers that are stored as pairs of numerator and denominator. It is parameterized by the types of the numerator (NuT
) and denominator (DeT
). By default, these are Int
, but other types of Rational
are possible by using a different parameterization. In addition, Rational
objects are immutable throughout their life.
class Positive does Rational[UInt] {}; my Positive $one-third = Positive.new(1,3); say $one-third; # OUTPUT: «0.333333» my Positive $fail =Positive.new(-2,3); # OUTPUT: «Type check failed in binding to parameter 'nu'; expected UInt but got Int (-2)»
Please note that, since DeT
is by default equal to NuT
, in this case both are instantiated to UInt
. Built into Raku are Rat
and FatRat
, which both do the Rational
role.
Methods§
method new§
method new(NuT:D $numerator, DeT:D $denominator --> Rational:D)
Creates a new rational object from numerator and denominator, which it normalizes to the lowest terms. The $denominator
can be zero, in which case the numerator is normalized to -1
, 0
, or 1
depending on whether the original is negative, zero, or positive, respectively.
method Bool§
multi method Bool(Rational:D: --> Bool:D)
Returns False
if numerator is 0
, otherwise returns True
. This applies for <0/0>
zero-denominator <Rational
as well, despite ?<0/0>.Num
being True
.
method Bridge§
method Bridge()
Returns the number, converted to Num
.
method Int§
method Int(Rational:D: --> Int:D)
Coerces the invocant to Int
by truncating non-whole portion of the represented number, if any. If the denominator is zero, will fail with X::Numeric::DivideByZero
.
method Num§
method Num(Rational:D: --> Num:D)
Coerces the invocant to Num
by dividing numerator by denominator. If denominator is 0
, returns Inf
, -Inf
, or NaN
, based on whether numerator is a positive number, negative number, or 0
, respectively.
method ceiling§
method ceiling(Rational:D: --> Int:D)
Return the smallest integer not less than the invocant. If denominator is zero, fails with X::Numeric::DivideByZero
.
method floor§
method floor(Rational:D: --> Int:D)
Return the largest integer not greater than the invocant. If denominator is zero, fails with X::Numeric::DivideByZero
.
method isNaN§
method isNaN(Rational:D: --> Bool:D)
Tests whether the invocant's Num value is a NaN, an acronym for Not available Number. That is both its numerator and denominator are zero.
method numerator§
method numerator(Rational:D: --> NuT:D)
Returns the numerator.
method denominator§
method denominator(Rational:D: --> DeT:D)
Returns the denominator.
method nude§
method nude(Rational:D: --> Positional)
Returns a list of the numerator and denominator.
method norm§
method norm(Rational:D: --> Rational:D)
DEPRECATED as of 6.d. The method is no longer needed, because as of 6.d language version, it's required for Rational
type to be normalized on creation.
Returns a normalized Rational object, i.e. with positive denominator, and numerator and denominator coprime. The denominator can also by zero, but using it in any operation or a conversion to string will result in an exception.
use v6.c; my Rational $by-zero = 3/0; say $by-zero.norm.raku; # OUTPUT: «<1/0>»
say $by-zero; # OUTPUT: «Attempt to divide by zero when coercing Rational to Str
method base-repeating§
method base-repeating(Rational:D: Int:D() $base = 10)
Returns a list of two strings that, when concatenated, represent the number in base $base
. The second element is the one that repeats. For example:
my ($non-rep, $repeating) = (19/3).base-repeating(10); say $non-rep; # OUTPUT: «6.» say $repeating; # OUTPUT: «3» printf '%s(%s)', $non-rep, $repeating; # OUTPUT: «6.(3)»
19/3 is 6.333333... with the 3 repeating indefinitely.
If no repetition occurs, the second string is empty:
say (5/2).base-repeating(10).raku; # OUTPUT: «("2.5", "")»
The precision for determining the repeating group is limited to 1000 characters, above that, the second string is ???
.
$base
defaults to 10
.
method Range§
Returns a Range object that represents the range of values supported.