Click here to get back home

sprintf rounding with FreeBSD and perl 5.8.x

 HomeNewsGroups | Search | About
 comp.lang.perl.misc    Post an article   get this group's latest topics as an RSS feed add this group's latest topics to your My MSN content add this group's latest topics to your My Yahoo content
Subject Author Date
sprintf rounding with FreeBSD and perl 5.8.x cherbst 01-24-2008
Get Chitika Premium
Posted by cherbst on January 24, 2008, 11:51 am
Please log in for more thread options
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?

Posted by J. Gleixner on January 24, 2008, 12:03 pm
Please log in for more thread options
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.

Posted by cherbst on January 24, 2008, 12:10 pm
Please log in for more thread options
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

---

Posted by RedGrittyBrick on January 24, 2008, 12:39 pm
Please log in for more thread options
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.

Posted by cherbst on January 24, 2008, 3:18 pm
Please log in for more thread options
wrote:
> cher...@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:

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...)

Similar ThreadsPosted
sprintf rounding puzzlements December 11, 2004, 11:09 pm
perl and GDBM and FreeBSD February 8, 2005, 10:19 am
Perl on freebsd: max memory limit? February 10, 2005, 7:25 am
Cannot compile working perl on freebsd / amd64 December 10, 2004, 12:51 am
Failed Xmms-Perl-0.12 build on FreeBSD 5.4-stable July 18, 2005, 7:20 am
DBD::SQLite FreeBSD install August 30, 2007, 10:51 pm
File::Find in FreeBSD msdosfs mounts August 14, 2004, 9:37 pm
perk 5.8.5 forking causes userland crash on FreeBSD September 23, 2004, 9:49 am
how to manage phpBB, windows 2003 server and FreeBSD user accounts simultaneously. November 29, 2004, 9:18 pm
Is there a web interface tool that can manage accounts of FreeBSD and Windows 2003 server simultaneously January 5, 2005, 6:55 pm

Our other projects:

Art Dolls, Fairies and Mermaids - Sunnyfaces.net

Roy's Linux, Programming and Search Engines messages

1-Script XML SitemapXML Sitemap