in reply to Re^2: Portability of floor(log(N))
in thread Portability of floor(log(N))
Thank you for the suggestions.
I think they were completely irrelevant to the problem you're facing.
Silly me didn't think to actually check what the correct calculation of floor( log($num) / log(1000) ) should yield under 'long double' (64bit) precision.
When I do check, I find that the correct answer is 12.
The error is in your test script ... either that, or in Math::MPFR:
And, IIUC, the test script should accept '1000e36' as correct when NV precision is 64 bits (as is the case with those 2 FAIL reports).
Interestingly, with full quad precision of 113 bits, the calculation reverts to returning 11.
Cheers,
Rob
I think they were completely irrelevant to the problem you're facing.
Silly me didn't think to actually check what the correct calculation of floor( log($num) / log(1000) ) should yield under 'long double' (64bit) precision.
When I do check, I find that the correct answer is 12.
The error is in your test script ... either that, or in Math::MPFR:
This indicates that when the floating point precision is 64 bits, the correct floor() result is 12.use strict; use warnings; use Math::MPFR qw(:mpfr); # Set precision for extended # precision 'long double' Rmpfr_set_default_prec(64); my $num = Math::MPFR>new('1e33'); my $thou = Math::MPFR>new('1000'); # Convert $num & $thou to their # respective log() Rmpfr_log($num, $num, MPFR_RNDN); Rmpfr_log($thou, $thou, MPFR_RNDN); print $num / $thou; # prints 1.10000000000000000009e1
And, IIUC, the test script should accept '1000e36' as correct when NV precision is 64 bits (as is the case with those 2 FAIL reports).
Interestingly, with full quad precision of 113 bits, the calculation reverts to returning 11.
Cheers,
Rob


Replies are listed 'Best First'.  

Re^4: Portability of floor(log(N))
by syphilis (Archbishop) on Mar 14, 2018 at 02:42 UTC  
by toolic (Bishop) on Mar 14, 2018 at 17:31 UTC  
by pryrt (Monsignor) on Mar 14, 2018 at 18:22 UTC 
In Section
Seekers of Perl Wisdom