Boost logo

Boost :

Subject: Re: [boost] Floating point truncation bug in qi::float_
From: OvermindDL1 (overminddl1_at_[hidden])
Date: 2010-09-28 23:10:48


On Tue, Sep 28, 2010 at 4:11 PM, Hartmut Kaiser
<hartmut.kaiser_at_[hidden]> wrote:
>> Hi I am using boost 1.4.1 Spirit::Qi.
>>
>> I think we have a floating point truncation bug in the qi::float_ parser.
>> I attached a simple program to repro the bug.
>>
>> Below are some examples of an input floating point gets truncated (=>) by
>> the qi::float_:
>>
>> 12312321421421 => 12312321720320.000000
>> 123123214   => 123123216.000000
>> 123233.4124 => 123233.406250
>>
>> I don't see the same issue with the qi::double_.
>>
>> Wondering if this is a known issue?
>
> If I do:
>
>    #include <iostream>
>    #include <iomanip>
>
>    int main()
>    {
>        float f1 = 12312321421421.f;
>        float f2 = 123123214.f;
>        float f3 = 123233.4124f;
>
>        std::cout.precision(20);
>
>        std::cout << "12312321421421 --> " << f1 << std::endl;
>        std::cout << "123123214 --> "      << f2 << std::endl;
>        std::cout << "123233.4124 --> "    << f3 << std::endl;
>        return 0;
>    }
>
> I get (gcc 4.5.1 and VS2010):
>
>    12312321421421 --> 12312321720320
>    123123214 --> 123123216
>    123233.4124 --> 123233.4140625
>
> which is almost consistent with what Spirit is doing. The last case worries me, though. I'll try to have a closer look there.

Don't forget, you can output the hex forms of it too using the new C99
float hex convert for things like printf, the hex form would probably
explain it.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk