|
|
Message-ID: <20190925155151.GV9017@brightrain.aerifal.cx>
Date: Wed, 25 Sep 2019 11:51:51 -0400
From: Rich Felker <dalias@...c.org>
To: Anastasios <antonbachin@...oo.com>
Cc: musl@...ts.openwall.com
Subject: Re: Bug report: strtod drops LSB
On Wed, Sep 25, 2019 at 09:32:35AM -0500, Anastasios wrote:
> Hello,
>
> Consider this program, strtod.c:
>
> #include <stdlib.h>
> #include <stdio.h>
>
> int main()
> {
> printf("%lf\n", strtod("283686952306183", NULL));
> }
>
> With current musl master from Git:
>
> $ musl-gcc -static strtod.c -o a.musl
> $ ./a.musl
> 283686952306176.000000
>
> By comparison, with glibc:
>
> $ gcc -static strtod.c -o a.glibc
> $ ./a.glibc
> 283686952306183.000000
>
> The correct binary representation of this float is
>
> 0x42f0203040506070
>
> but musl strtod produces
>
> 0x42f0203040506000
>
> i.e., it fails to set the LSB. I examined this while ruling out printf as the cause.
I can't reproduce this. My test program for strtod shows, for the
input "283686952306183":
d: 283686952306183 [0x1.020304050607p+48] [42f0203040506070]
I suspect you miscompiled musl, possibly by passing in CFLAGS (perhaps
from defaults in your environment?) that break floating point
semantics. We test for and refuse to build if __FAST_MATH__ is
defined, but GCC only defines it if you use -ffast-math, not if you
manually enable one or more of the individual broken options that
-ffast-math enables.
Alternatively, it's possible that you have a broken compiler version
that miscompiles floating point code.
Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.