In my code I need some specified precision decimal operations, so I decided to use Math::BigFloat and I run into problems. Consider simple test case below:
use Test::More tests => 10; use_ok 'Math::BigFloat'; note 'Math tests'; for( my $i = 1; $i < 1000000000; $i *= 10 ) { my $bf = Math::BigFloat->new( $i ); $bf->precision(-2); my $xpect = ($bf > 1 ? '3' x (scalar($bf->length) - 1) : 0) . ".33"; is $bf->bdiv(3), $xpect, $i . ' / 3 = ' . $xpect; }
At some level it looses its precision, every result should end with .33(3), which after rounding should give .33 - but it doesn't. At 100`000 level you get 33`333.30 as a result, at 100`000`000 result is even less precise 33`333`300.00.
I use my own Decimal "class", so I've implemented some walk-around - before issuing division change precision to much more "precise", issue 'bdiv', chage precision back as it was - and this helps, but it is very uncool ;) solution.
And as for this test case, doing similar as in my walk-around, changing code in loop to this helps:
for( my $i = 1; $i < 1000000000; $i *= 10 ) { my $bf = Math::BigFloat->new( $i ); my $xpect = ($bf > 1 ? '3' x (scalar($bf->length) - 1) : 0) . ".33"; is $bf->bdiv(3)->bfround(-2), $xpect, $i . ' / 3 = ' . $xpect; }
In reply to Another Math::BigFloat precision question by Seba
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |