Float literals

In Sidef, all literal numbers are specially parsed and converted implicitly into a rational number, which are internally represented by Math::GMPz and Math::GMPq.

1.234           # 1.234
.1234           # 0.1234
1234e-5         # 0.01234
12.34e5         # 1234000

This means that Sidef, by default, does not suffer from the floating-point inaccuracy:

0.1 + 0.2 == 0.3    # true

An integer or a rational number can be converted to a floating-point value by using the .float Number method, which represents floating-points using Math::MPFR (which is the Perl interface to the MPFR library) at a default precision of 192 bits:

1.234.float         # conversion to floating-point number

In numerical operations, a floating-point number will automatically propagate:

var x = 3/4         # rational
var y = 0.9.float   # floating-point
var z = x+y         # floating-point

The precision of floating-point numbers can be changed by modifying the Num!PREC class-variable:

say sqrt(2)          # 1.41421356237309504880168872420969807856967187538
local Num!PREC = 24  # number of bits of precision
say sqrt(2)          # 1.41421

By using the local keyword, the precision will be changed only locally (which also includes any function/method call in the current scope):

func my_sqrt(n) {
    sqrt(n)
}

say my_sqrt(2)              # 1.41421356237309504880168872420969807856967187538

do {                        # creates a new scope
    local Num!PREC = 24     # changes the floating-point precision locally
    say my_sqrt(2)          # 1.41421
}                           # the default precision is restored when the scope ends

say my_sqrt(2)              # 1.41421356237309504880168872420969807856967187538