class Num
class Num is Cool does Real { }
A Num
object stores a floating-point number. It is immutable. On most
platforms, it's an IEEE 754 64-bit floating point numbers, aka "double
precision".
Inf
The value Inf
is an instance of Num
and represents value that's too large
to represent in 64-bit double-precision floating point number (roughly, above
1.7976931348623158e308
for positive Inf
and below
-1.7976931348623157e308
for negative Inf
) as well as returned from certain
operations as defined by the
IEEE 754-2008 standard.
say 2e300 ** 2e300; # OUTPUT: «Inf»
say (-1/0).Num; # OUTPUT: «-Inf»
The ∞
U+221E
Unicode character can be used instead of
the word Inf
and can be handy when Inf
would otherwise require an
unspace, such as when writing Complex numbers:
say Inf+Inf\i; # Backslash (unspace) before `i` required
say ∞+∞i; # No backslash is needed
Note that there are just two infinities (positive and negative), so even if an operation that would instinctively give a "larger" infinity is performed, the result in still an infinity of the original magnitude. The infinities can be compared, operated and used as an argument as if they were simply a number that's too big to represent or to signify "without bounds" or limits:
say ∞²; # OUTPUT: «Inf»
say 42 + Inf === ∞; # OUTPUT: «True»
say atan ∞; # OUTPUT: «1.5707963267949»
say -∞ < 42 < ∞; # OUTPUT: «True»
my $l := 1, 2, 4, 8 ... Inf; # Infinite sequence (no limits)
In some cases, it's used as an implicit value to represent "all of them"
say "House of M".comb(3,Inf).join("←X→");
# OUTPUT: «Hou←X→se ←X→of ←X→M»
In the example above, Inf
can be eliminated, since it's the default value for
the second argument of .comb, used to indicate how
many parts should be returned.
Division of an infinity by another infinity results in a NaN
:
say ∞/∞; # OUTPUT: «NaN»
NaN
The value NaN
|Reference,NaN (definition) is an instance of Num
and represents a
floating point not-a-number value, which is returned from some routines where
a concrete number as the answer is not defined, but a Numeric value is still
acceptable. NaN
is defined and boolifies
to True
, but is not numerically equal to any value (including itself).
say cos ∞; # OUTPUT: «NaN»
say (0/0).Num; # OUTPUT: «NaN»
To test for NaN
, use isNaN method or === operator:
say (0/0).isNaN; # OUTPUT: «True»
say (0/0).Num === NaN; # OUTPUT: «True»
method new
multi method new()
multi method new($n)
Num.new
without argument will create a Num
with the value 0e0
. With an
argument, it will be coerced to Num
and then returned.
say Num.new(⅓); # OUTPUT: «0.3333333333333333»
method rand
method rand(Num:D: --> Num)
Returns a pseudo random number between 0 and the invocant.
sub srand
sub srand(Int $seed --> Int:D)
Seeds the pseudo random number generator used by Num.rand with
the provided value. Note that srand
is called with a platform dependent
value when a Raku program is started.
method Capture
method Capture()
Throws X::Cannot::Capture
.
method Int
method Int(Num:D:)
Converts the number to an Int. Fails with
X::Numeric::CannotConvert
if the invocant is a NaN
or Inf
/-Inf
. No rounding is performed.
method Rat
method Rat(Num:D: Real $epsilon = 1e-6)
Converts the number to a Rat with $epsilon
precision. If the invocant
is an Inf
, -Inf
, or NaN
, converts them to a Rat with 0
denominator and 1
, -1
, or 0
numerator, respectively.
method FatRat
method FatRat(Num:D: Real $epsilon = 1e-6)
Converts the number to a FatRat with the precision $epsilon
. If invocant
is an Inf
, -Inf
, or NaN
, converts them to a FatRat with 0
denominator and 1
, -1
, or 0
numerator, respectively.
method Num
method Num()
Returns the invocant.
method Str
method Str(Int:D)
Returns a string representation of the number.
say π.Str; # OUTPUT: «3.141592653589793»
Cool being a parent class of Num
, an explicit call
to the Num.Str
method is seldom needed.
say π.Str.comb == π.comb; # OUTPUT: «True»
method Bridge
method Bridge(Num:D:)
Returns the number.