role Rational
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.