From 9e805cf5c975429a7039efceadac56debbfd6410 Mon Sep 17 00:00:00 2001 From: trizen Date: Sun, 11 Aug 2019 00:52:59 +0300 Subject: [PATCH] - Slightly faster conversion of integer strings (>= 2^64) into numbers. `Num("ddd...ddd")` is now faster than `Num("ddd...ddde0")`, where previosuly the performance was the same. --- lib/Sidef/Types/Number/Number.pm | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/Sidef/Types/Number/Number.pm b/lib/Sidef/Types/Number/Number.pm index a7a0b627a..1d065e5ec 100644 --- a/lib/Sidef/Types/Number/Number.pm +++ b/lib/Sidef/Types/Number/Number.pm @@ -321,8 +321,8 @@ package Sidef::Types::Number::Number { ); } - # Floating-point - if ($s =~ /^([+-]?+(?=\.?[0-9])[0-9_]*+(?:\.[0-9_]++)?(?:[Ee](?:[+-]?+[0-9_]+))?)\z/) { + # Decimal expansion (parsed as a rational value) + if ($s =~ tr/e.// and $s =~ /^([+-]?+(?=\.?[0-9])[0-9_]*+(?:\.[0-9_]++)?(?:[Ee](?:[+-]?+[0-9_]+))?)\z/) { my $frac = _str2frac($1); if (index($frac, '/') != -1) { @@ -400,16 +400,18 @@ package Sidef::Types::Number::Number { } } - # Floating point value - if ($s =~ tr/e.//) { - my $r = Math::MPFR::Rmpfr_init2(CORE::int($PREC)); - if (Math::MPFR::Rmpfr_set_str($r, $s, 10, $ROUND)) { - Math::MPFR::Rmpfr_set_nan($r); - } - return $r; - } +#<<< + # Decimal expansion (parsed as a floating-point value) + #~ if ($s =~ tr/e.//) { + #~ my $r = Math::MPFR::Rmpfr_init2(CORE::int($PREC)); + #~ if (Math::MPFR::Rmpfr_set_str($r, $s, 10, $ROUND)) { + #~ Math::MPFR::Rmpfr_set_nan($r); + #~ } + #~ return $r; + #~ } +#>>> - # Remove the plus sign (if any) + # Remove a leading plus sign $s =~ s/^\+// if substr($s, 0, 1) eq '+'; # Fractional value