# class FatRat

Rational number (arbitrary-precision)

```
class FatRat is Cool does Rational[Int, Int]
```

A `FatRat`

is a rational number stored with arbitrary size numerator and denominator. Arithmetic operations involving a `FatRat`

and optionally Int or Rat objects return a `FatRat`

, avoiding loss of precision.

Since, unlike Rat, FatRat arithmetics do not fall back Num at some point, there is a risk that repeated arithmetic operations generate pathologically large numerators and denominators.

There are two common ways to generate `FatRat`

objects: through the `FatRat.new(Int, Int)`

constructor, which generates them from numerator and denominator, or by calling the `.FatRat`

method on an Int or Rat object.

# Type graph

Below you should see a clickable image showing the type relations for FatRat that links to the documentation pages for the related types. If not, try the PNG version instead.

# Methods supplied by role Rational

FatRat does role Rational, which provides the following methods:

## method new

```
method new(NuT:D $numerator, DenomT:D $denominator) returns Rational:D
```

Creates a new rational object from numerator and denominator.

## method numerator

```
method numerator(Rational:D:) returns NuT:D
```

Returns the numerator.

## method denominator

```
method denominator(Rational:D:) returns DenomT:D
```

Returns the denominator.

## method nude

```
method nude(Rational:D:) returns Positional
```

Returns a list of the numerator and denominator.

## method norm

```
method norm(Rational:D:) returns Rational:D
```

Returns a normalized Rational object, i.e. with positive denominator, and numerator and denominator coprime.

## method base-repeating

```
method base-repeating(Rational:D: Int:D() $base)
```

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; # 6.
say $rep; # 3
printf '%s(%s)', $non-rep, $repeating; # 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).perl; # ("2.5", "")
```

The precision for detrmining the repeating group is limited to 1000 characters, above that, the second string is `???`

.

# Methods supplied by role Real

FatRat does role Real, which provides the following methods:

## method Rat

```
method Rat(Real:D: Real $epsilon = 1e-6)
```

Converts the number to a `Rat`

with the precision `$epsilon`

.

## method sign

```
method sign(Real:D:)
```

Returns `-1`

if the number is negative, `0`

if it is zero and `1`

otherwise.

## method round

```
method round(Real:D: $scale = 1)
```

Rounds the number to scale `$scale`

. If `$scale`

is 1, rounds to an integer. If scale is `0.1`

, rounds to one digit after the comma etc.

## method floor

```
method floor(Real:D) returns Int:D
```

Return the largest integer not greater than the number.

## method ceiling

```
method ceiling(Real:D) returns Int:D
```

Returns the smallest integer not less than the number.

## method truncate

```
method truncate(Real:D) returns Int:D
```

Rounds the number towards zero.

## method base

```
method base(Real:D: Int:D $base where 2..36, $digits?) returns Str:D
```

Converts the number to a string, using `$base`

as base. For `$base`

larger than ten, capital Latin letters are used.

```
255.base(16) # 'FF'
```

The optional `$digits`

argument asks for that many digits of fraction (which may not be negative). If omitted, a reasonable default is chosen based on type. For Int this default is 0. For Num, the default is 8. For Rational, the number of places is scaled to the size of the denominator, with a minimum of 6.

The final digit produced is always rounded.

```
say pi.base(10, 5); # 3.14159
```

# Methods supplied by role Numeric

FatRat does role Numeric, which provides the following methods:

## method Real

```
method Real(Numeric:D:) returns Real:D
```

If this `Numeric`

is equivalent to a `Real`

, return that `Real`

. Fail with `X::Numeric::Real`

otherwise.

## method Int

```
method Int(Numeric:D:) returns Int:D
```

If this `Numeric`

is equivalent to a `Real`

, return the equivalent of calling `truncate`

on that `Real`

to get an `Int`

. Fail with `X::Numeric::Real`

otherwise.

## method Rat

```
method Rat(Numeric:D: Real $epsilon = 1.0e-6) returns Rat:D
```

If this `Numeric`

is equivalent to a `Real`

, return a `Rat`

which is within `$epsilon`

of that `Real`

's value. Fail with `X::Numeric::Real`

otherwise.

## method Num

```
method Num(Numeric:D:) returns Num:D
```

If this `Numeric`

is equivalent to a `Real`

, return that `Real`

as a `Num`

as accurately as is possible. Fail with `X::Numeric::Real`

otherwise.

## method narrow

```
method narrow(Numeric:D) returns Numeric:D
```

Returns the number converted to the narrowest type that can hold it without loss of precision.

```
say (4.0 + 0i).narrow.perl; # 4
say (4.0 + 0i).narrow.^name; # Int
```

## method ACCEPTS

```
multi method ACCEPTS(Numeric:D: $other)
```

Returns True if `$other`

is numerically the same as the invocant.

## method roots

```
multi method roots(Numeric:D: Int:D $n) returns Positional
```

Returns a list of the `$n`

complex roots, which evaluate to the original number when raised to the `$n`

th power.

## method conj

```
multi method conj(Numeric:D) returns Numeric:D
```

Returns the complex conjugate of the number. Returns the number itself for real numbers.

## method Bool

```
multi method Bool(Numeric:D:)
```

Returns `False`

if the number is equivalent to zero, and `True`

otherwise.

## method succ

```
method succ(Numerid:D:)
```

Returns the number incremented by one (successor).

## method pred

```
method pred(Numerid:D:)
```

Returns the number decremented by one (predecessor).

# Methods supplied by class Cool

FatRat inherits from class Cool, which provides the following methods:

## method abs

```
method abs()
```

Coerces the invocant to Numeric and returns the absolute value (that is, a non-negative number).

## method conj

```
method conj()
```

Coerces the invocant to Numeric and returns the complex conjugate (that is, the number with the sign of the imaginary part negated).

## method sqrt

```
method sqrt()
```

Coerces the invocant to Numeric and returns the square root, that is, a non-negative number that, when multiplied with itself, produces the original number.

## method sign

```
method sign()
```

Coerces the invocant to Numeric and returns its sign, that is, 0 if the number is 0, 1 for positive and -1 for negative values.

## method rand

```
method rand()
```

Coerces the invocant to Num and returns a pseudo-random value between zero and the number.

## method sin

```
method sin()
```

Coerces the invocant to Numeric, interprets it as radians, returns its sine.

## method asin

```
method asin()
```

Coerces the invocant to Numeric, and returns its arc-sine in radians.

## method cos

```
method cos()
```

Coerces the invocant to Numeric, interprets it as radians, returns its sine.

## method acos

```
method acos()
```

Coerces the invocant to Numeric, and returns its arc-cosine in radians.

## method tan

Coerces the invocant to Numeric, interprets it as radians, returns its tangens.

## method atan

```
method atan()
```

Coerces the invocant to Numeric, and returns its arc-tangens in radians.

## method atan2

```
method atan2($y = 1e0)
```

Coerces the invocant to Numeric, and together with its argument, returns its two-argument arc-tangens in radians.

## method sec

```
method sec()
```

Coerces the invocant to Numeric, interprets it as radians, returns its secans, that is, the reciprocal of its cosine.

## method asec

```
method asec()
```

Coerces the invocant to Numeric, and returns its arc-secans in radians.

## method cosec

```
method cosec()
```

Coerces the invocant to Numeric, interprets it as radians, returns its cosecans, that is, the reciprocal of its sine.

## method acosec

```
method acosec()
```

Coerces the invocant to Numeric, and returns its arc-cosecans in radians.

## method cotan

```
method cotan()
```

Coerces the invocant to Numeric, interprets it as radians, returns its cotangens, that is, the reciprocal of its tangens.

## method acotan

```
method acotan()
```

Coerces the invocant to Numeric, and returns its arc-cotangens in radians.

## method sinh

```
method sinh()
```

Coerces the invocant to Numeric, and returns its Sine hyperbolicus.

## method asinh

```
method asinh()
```

Coerces the invocant to Numeric, and returns its Inverse Sine hyperbolicus.

## method cosh

```
method cosh()
```

Coerces the invocant to Numeric, and returns its Cosine hyperbolicus.

## method acosh

```
method acosh()
```

Coerces the invocant to Numeric, and returns its Inverse Cosine hyperbolicus.

## method tanh

```
method tanh()
```

Coerces the invocant to Numeric, and returns its Tangens hyperbolicus.

## method atanh

```
method atanh()
```

Coerces the invocant to Numeric, and returns its Inverse tangens hyperbolicus.

## method log

```
multi method log(Cool:D: Cool:D $base?)
```

Coerces the invocant to Numeric, and returns its Logarithm to base `$base`

, or to base `e`

(Euler's Number) if no base was supplied (Natural logarithm.

## method exp

```
multi method exp(Cool:D: Cool:D $base?)
```

Coerces the invocant to Numeric, and returns `$base`

raised to the power of this number. If no `$base`

is supplied, `e`

(Euler's Number) is used.

```
say 0.exp; # 1
say 1.exp; # 2.71828182845905
say 10.exp; # 22026.4657948067
```

## method round

```
multi method round(Cool:D: $unit = 1)
```

Coerces the invocant to Numeric, and rounds it to the unit of `$unit`

. If `$unit`

is 1, rounds to the nearest integer.

```
say 1.7.round; # 2
say 1.07.round(0.1); # 1.1
say 21.round(10); # 20
```

## method floor

```
multi method floor
```

Coerces the invocant to Numeric, and rounds it downwards to the nearest integer.

```
say "1.99".floor; # 1
say "-1.9".floor; # -2
say 0.floor; # 0
```

## method ceiling

```
multi method ceiling
```

Coerces the invocant to Numeric, and rounds it upwards to the nearest integer.

```
say "1".ceiling; # 1
say "-0.9".ceiling; # 0
say "42.1".ceiling; # 43
```

## method ord

```
method ord()
```

Coerces the invocant to Str, and returns the Unicode code point, number of the code point.

```
say 'a'.ord; # 65
```

The inverse operation is chr.

## method chr

```
method chr()
```

Coerces the invocant to Int, interprets it as a Unicode code points, and returns a string made of that code point.

```
say '65'.chr; # A
```

The inverse operation is ord.

Mnemonic: turns an integer into a *char*acter.

## method chars

```
method chars()
```

Coerces the invocant to Str, and returns the number of characters in the string. Characters should actually be grapheme clusters, though current implementation errornously count codepoints instead.

```
say 'møp'.chars; # 3
```

## method codes

```
method codes()
```

Coerces the invocant to Str, and returns the number of Unicode code points.

```
say 'møp'.codes; # 3
```

## method flip

```
method flip()
```

Coerces the invocant to Str, and returns a reversed version.

```
say 421.flip; # 124
```

## method trim

```
method trim()
```

Coerces the invocant to Str, and returns the string with both leading and trailing whitespace stripped.

```
my $stripped = ' abc '.trim;
say "<$stripped>"; # <abc>
```

## method trim-leading

```
method trim(-leading)
```

Coerces the invocant to Str, and returns the string with leading whitespace stripped.

```
my $stripped = ' abc '.trim-leading;
say "<$stripped>"; # <abc >
```

## method trim-trailing

```
method trim-trailing()
```

Coerces the invocant to Str, and returns the string with both leading and trailing whitespace stripped.

```
my $stripped = ' abc '.trim-trailing;
say "<$stripped>"; # < abc>
```

## method lc

```
method lc()
```

Coerces the invocant to Str, and returns it case-folded to lower case.

```
say "ABC".lc; # abc
```

## method uc

```
method uc()
```

Coerces the invocant to Str, and returns it case-folded to upper case (capital letters).

```
say "Abc".uc; # ABC
```

## method tc

```
method tc()
```

Coerces the invocant to Str, and returns it with the first letter case-folded to title case (or where not available, upper case).

```
say "abC".tc; # AbC
```

## method tclc

```
method tclc()
```

Coerces the invocant to Str, and returns it with the first letter case-folded to title case (or where not available, upper case), and the rest of the string case-folded to lower case..

```
say 'abC'.tclc; # Abc
```

## method wordcase

```
method wordcase(:&filter = &tclc, Mu :$where = True)
```

Coerces the invocant to Str, and filters each word that smart-matches against `$where`

through the `&filter`

. With the default filter (first character to upper case, rest to lower) and matcher (which accepts everything), this title-cases each word:

```
say "perl 6 programming".wordcase; # Perl 6 Programming
```

With a mather:

```
say "have fun working on perl".wordcase(:where({ .chars > 3 }));
# Have fun Working on Perl
```

With a customer filter too:

```
say "have fun working on perl".wordcase(:filter(&uc), :where({ .chars > 3 }));
# HAVE fun WORKING on PERL
```

## method chop

```
method chop()
```

Coerces the invocant to Str, and returns it with the last character removed.

```
say 'perl'.chop; # per
```

## method chomp

```
method chomp()
```

Coerces the invocant to Str, and returns it with the last character removed, if it is a logical newline.

```
say 'ab'.chomp.chars; # 2
say "a\n".chomp.chars; # 1
```

## method words

```
method words(Int() $limit)
```

Coerces the invocan to Str, and returns a list of words that make up the string (and if `$limit`

is supplied, only the first `$limit`

words).

```
say 'The quick brown fox'.words.join('|'); # The|quick|brown|fox
say 'The quick brown fox'.words(2).join('|'); # The|quick
```

Only whitespace counts as word boundaries

```
say "isn't, can't".words.join('|'); # isn't,|can't
```

## method IO

```
method IO() returns IO::Path:D
```

Coerces the invocant to IO::Path.

```
.say for '.'.IO.dir; # gives a directory listing
```

# Methods supplied by class Any

FatRat inherits from class Any, which provides the following methods:

## method ACCEPTS

```
multi method ACCEPTS(Any:D: Mu $other)
```

Returns `True`

if `$other === self`

(i.e. it checks object identity).

## method any

Interprets the invocant as a list and creates an `any`

-Junction from it.

## method all

Interprets the invocant as a list and creates an `all`

-Junction from it.

## method one

Interprets the invocant as a list and creates an `one`

-Junction from it.

## method none

Interprets the invocant as a list and creates an `none`

-Junction from it.

## method list

Interprets the invocant as a list, and returns that list.

## method flat

Interprets the invocant as a list, flattens it, and returns that list.

```
say ((1, 2), (3)).elems; # 2
say ((1, 2), (3)).flat.elems; # 3
```

## method eager

Interprets the invocant as a list, evaluates it eagerly, and returns that list.

## method elems

Interprets the invocant as a list, and returns the number of elements in the list.

## method end

Interprets the invocant as a list, and returns the last index of that list.

# Methods supplied by class Mu

FatRat inherits from class Mu, which provides the following methods:

## method Str

```
multi method Str() returns Str
```

Returns a string representation of the invocant, intended to be machine readable.

## method clone

```
method clone(*%twiddles)
```

Creates a shallow clone of the invocant. If named arguments are passed to it, their values are used in every place where an attribute name matches the name of a named argument.

## method new

```
multi method new(*%attrinit)
```

Default method for constructing (create + initialize) new objects of a class. This method expects only named arguments which are then used to initialize attributes with accessors of the same name.

Classes may provide their own `new`

method to override this default.

## method bless

```
method bless(*%attrinit) returns Mu:D
```

Lower-level object construction method than `new`

.

Creates a new object of the same type as the invocant, uses the named arguments to initialize attributes, and returns the created object.

You can use this method when writing custom constructors:

```
class Point {
has $.x;
has $.y;
multi method new($x, $y) {
self.bless(:$x, :$y);
}
}
my $p = Point.new(-1, 1);
```

(Though each time you write a custom constructor, remember that it makes subclassing harder).

## method CREATE

```
method CREATE() returns Mu:D
```

Allocates a new object of the same type as the invocant, without initializing any attributes.

## method print

```
multi method print() returns Bool:D
```

Prints value to `$*OUT`

after stringification using `.Str`

method without newline at end.

## method say

```
multi method say() returns Bool:D
```

Prints value to `$*OUT`

after stringification using `.gist`

method with newline at end.

## method ACCEPTS

```
multi method ACCEPTS(Mu:U: $other)
```

Performs a type check. Returns `True`

if `$other`

conforms to the invocant (which is always a type object or failure).

This is the method that is triggered on smart-matching against type objects, for example in `if $var ~~ Int { ... }`

.

## method WHICH

```
multi method WHICH() returns ObjAt:D
```

Returns an object of type ObjAt which uniquely identifies the object. Value types override this method which makes sure that two equivalent objects return the same return value from `WHICH`

.

## method WHERE

```
method WHERE() returns Int
```

Returns an `Int`

representing the memory address of the object.

## method WHY

```
multi method WHY()
```

Returns the attached Pod value. For instance,

```
sub cast(Spell $s)
#= Initiate a specified spell normally
#= (do not use for class 7 spells)
{
do-raw-magic($s);
}
say &cast.WHY;
```

prints

```
Initiate a specified spell normally (do not use for class 7 spells)
```

See the documentation specification for details about attaching Pod to variables, classes, functions, methods, etc.

This documentation was generated from FatRat.pod.