Skip to content

Commit

Permalink
- Added the NaN built-in object to represent the not-a-number value.
Browse files Browse the repository at this point in the history
- Added the `-Inf` built-in object to represent negative infinity.
- Fixed the Number.length() method to always return correctly the number of digits in a number.
- Infinity is no longer positize, nor odd.
  • Loading branch information
trizen committed Dec 28, 2015
1 parent a75d5d9 commit be1542b
Show file tree
Hide file tree
Showing 7 changed files with 16 additions and 3 deletions.
3 changes: 3 additions & 0 deletions lib/Sidef/Deparse/Perl.pm
Original file line number Diff line number Diff line change
Expand Up @@ -898,6 +898,9 @@ HEADER
elsif ($ref eq 'Sidef::Types::Number::Ninf') {
$code = $self->make_constant($ref, 'new', "Ninf$refaddr");
}
elsif ($ref eq 'Sidef::Types::Number::Nan') {
$code = $self->make_constant($ref, 'new', "Nan$refaddr");
}
elsif ($ref eq 'Sidef::Types::String::String') {
$code = $self->make_constant($ref, 'new', "String$refaddr", $self->_dump_string(${$obj}));
}
Expand Down
3 changes: 3 additions & 0 deletions lib/Sidef/Deparse/Sidef.pm
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,9 @@ package Sidef::Deparse::Sidef {
elsif ($ref eq 'Sidef::Types::Number::Ninf') {
$code = '-Inf';
}
elsif ($ref eq 'Sidef::Types::Number::Nan') {
$code = 'NaN';
}
elsif ($ref eq 'Sidef::Types::Array::Array' or $ref eq 'Sidef::Types::Array::HCArray') {
if (not @{$obj}) {
$code = 'Array';
Expand Down
2 changes: 2 additions & 0 deletions lib/Sidef/Parser.pm
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ package Sidef::Parser {
| Str(?:ing)?+\b (?{ state $x = Sidef::Types::String::String->new })
| Num(?:ber)?+\b (?{ state $x = Sidef::Types::Number::Number->new })
| Inf\b (?{ state $x = Sidef::Types::Number::Inf->new })
| -Inf\b (?{ state $x = Sidef::Types::Number::Ninf->new })
| NaN\b (?{ state $x = Sidef::Types::Number::Nan->new })
| RangeNum(?:ber)?+\b (?{ state $x = Sidef::Types::Range::RangeNumber->new })
| RangeStr(?:ing)?+\b (?{ state $x = Sidef::Types::Range::RangeString->new })
| Math\b (?{ state $x = Sidef::Math::Math->new })
Expand Down
4 changes: 2 additions & 2 deletions lib/Sidef/Types/Number/Inf.pm
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ package Sidef::Types::Number::Inf {
*is_power = \&is_ninf;
*is_pow = \&is_ninf;
*is_div = \&is_ninf;
*is_even = \&is_pos;
*is_odd = \&is_pos;
*is_even = \&is_ninf;
*is_odd = \&is_ninf;

sub nan {
state $x = Sidef::Types::Number::Nan->new;
Expand Down
2 changes: 2 additions & 0 deletions lib/Sidef/Types/Number/Nan.pm
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ package Sidef::Types::Number::Nan {

sub new { $NAN }

sub get_value { 'NaN' }

sub is_nan {
state $x = Sidef::Types::Bool::Bool->true;
}
Expand Down
1 change: 1 addition & 0 deletions lib/Sidef/Types/Number/Ninf.pm
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package Sidef::Types::Number::Ninf {
Sidef::Object::Object
Sidef::Convert::Convert
Sidef::Types::Number::Number
Sidef::Types::Number::Inf
);

use overload
Expand Down
4 changes: 3 additions & 1 deletion lib/Sidef/Types/Number/Number.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1007,7 +1007,9 @@ package Sidef::Types::Number::Number {
sub length {
my $z = Math::GMPz::Rmpz_init();
Math::GMPz::Rmpz_set_q($z, ${$_[0]});
_new_uint(Math::GMPz::Rmpz_sizeinbase($z, 10));

#_new_uint(Math::GMPz::Rmpz_sizeinbase($z, 10)); # turns out to be inexact
_new_uint(Math::GMPz::Rmpz_snprintf(my $buf, 0, "%Zd", $z, 0));
}

*len = \&length;
Expand Down

0 comments on commit be1542b

Please sign in to comment.