Home > Archive > PERL Miscellaneous > January 2008 > sprintf rounding with FreeBSD and perl 5.8.x
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
sprintf rounding with FreeBSD and perl 5.8.x
|
|
| cherbst@gmail.com 2008-01-24, 7:18 pm |
| I'm getting a weird result with some rounding in a sprintf with perl
5.8.8:
c = 2.47 / 100; # => 0.0247
sprintf("%.1f", 18500 * c); # => 457.0 (NOT on FreeBSD)
sprintf("%.1f", 18500 * 0.0247); # => 456.9
FreeBSD gives 456.9 for both sprintfs, I was able to reproduce it on a
fresh FreeBSD 6.3 install with the perl binary package, and from a
compiled binary.
On Linux perl 5.8.8 gives 457.0, and I get that answer on everything
else I tried (ruby and python on Linux and FreeBSD). I tried using
each of the methods Math::Round, but that is different from sprintf on
Linux, and that is the behavior I was trying to get. Is anybody aware
of something like an unusual CFLAG that might be getting passed when
perl is compiled on FreeBSD?
| |
| J. Gleixner 2008-01-24, 7:18 pm |
| cherbst@gmail.com wrote:
> I'm getting a weird result with some rounding in a sprintf with perl
> 5.8.8:
>
> c = 2.47 / 100; # => 0.0247
> sprintf("%.1f", 18500 * c); # => 457.0 (NOT on FreeBSD)
> sprintf("%.1f", 18500 * 0.0247); # => 456.9
That's not valid perl, so I have no idea how you're getting a result.
| |
| cherbst@gmail.com 2008-01-24, 7:18 pm |
| On Jan 24, 12:03 pm, "J. Gleixner" <glex_no-s...@qwest-spam-
no.invalid> wrote:
> That's not valid perl, so I have no idea how you're getting a result.
I had omitted the sigils, runs OK otherwise:
---
#!/usr/bin/perl -w
use strict;
my $c = 2.47 / 100; # => 0.0247
printf("%.1f\n", 18500 * $c); # => 457.0 (NOT on FreeBSD)
printf("%.1f\n", 18500 * 0.0247); # => 456.9
---
| |
| RedGrittyBrick 2008-01-24, 7:18 pm |
| cherbst@gmail.com wrote:
> I'm getting a weird result with some rounding in a sprintf with perl
> 5.8.8:
>
> c = 2.47 / 100; # => 0.0247
Odd comment! What do you mean "0.0247"?
$c = 2.47 / 100;
does not produce the result 0.0247, since 2.47 and .0247 aren't
representable in finite binary digits:
$ perl -e 'printf("%.20f\n%.20f\n", 2.47, 0.0247);'
2.47000000000000019540
0.02469999999999999973
hence ...
$ perl -e 'printf("%.20f\n%.20f\n", 2.47 / 100, 0.0247);'
0.02470000000000000320
0.02469999999999999973
> sprintf("%.1f", 18500 * c); # => 457.0 (NOT on FreeBSD)
> sprintf("%.1f", 18500 * 0.0247); # => 456.9
$ perl -e 'printf("%.20f\n%.20f\n", 18500*(2.47/100), 18500*0.0247);'
456.95000000000004547474
456.94999999999998863132
$ perl -e 'printf("%.1f\n%.1f\n", 18500*(2.47/100), 18500*0.0247);'
457.0
456.9
> FreeBSD gives 456.9 for both sprintfs, I was able to reproduce it on a
> fresh FreeBSD 6.3 install with the perl binary package, and from a
> compiled binary.
Maybe printing the intermediate results to more digits (as above) would
shed some light?
>
> On Linux perl 5.8.8 gives 457.0, and I get that answer on everything
> else I tried (ruby and python on Linux and FreeBSD). I tried using
> each of the methods Math::Round, but that is different from sprintf on
> Linux, and that is the behavior I was trying to get. Is anybody aware
> of something like an unusual CFLAG that might be getting passed when
> perl is compiled on FreeBSD?
Not I, but I'd guess there is something interesting to see in
perl -V
on your BSD and Linux systems.
| |
| cherbst@gmail.com 2008-01-24, 7:19 pm |
| On Jan 24, 12:39 pm, RedGrittyBrick <RedGrittyBr...@SpamWeary.foo>
wrote:
> cher...@gmail.com wrote:
>
>
> Odd comment! What do you mean "0.0247"?
>
> $c = 2.47 / 100;
> does not produce the result 0.0247, since 2.47 and .0247 aren't
> representable in finite binary digits:
Yes, I took a crash course in floating point problems over the last
few days. All I'm really trying to get at is why perl on FreeBSD is
different from everything else (ruby and python on Linux and FreeBSD).
> Not I, but I'd guess there is something interesting to see in
> perl -V
> on your BSD and Linux systems.
They *are* different, I hadn't used -V before:
Linux:
Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP THREADS_HAVE_PIDS
USE_ITHREADS
USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API
FreeBSD:
Compile-time options: MYMALLOC PERL_MALLOC_WRAP USE_64_BIT_INT
USE_LARGE_FILES USE_PERLIO
USE_64_BIT_INT looks interesting, still trying to hunt down where it's
set (not Makefile, not config.sh...)
| |
| Ilya Zakharevich 2008-01-24, 7:19 pm |
| [A complimentary Cc of this posting was sent to
<cherbst@gmail.com>], who wrote in article <94b94b78-24c9-4f8f-867d-e6d8f2e58fc2@s19g2000prg.googlegroups.com>:
> USE_64_BIT_INT looks interesting, still trying to hunt down where it's
> set (not Makefile, not config.sh...)
Assuming IEEE complience (should be taken as given), only NVsize
should matter. See the beginning of the thread on milliseconds for
details.
Hope this helps,
Ilya
|
|
|
|
|