This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Bug in std::floor?


> On 08/11/17 23:13 +0200, Nil Geisweiller wrote:
>
>> The following
>>
>> ---------------------------------------------------------------------
>> #include <iostream>
>> #include <cmath>
>>
>> int main()
>> {
>>    double v = 4.6;
>>    std::cout << "v = " << v << std::endl;
>>    std::cout << "v*100 = " << v*100 << std::endl;
>>    std::cout << "floor(v*100) = " << std::floor(v*100) << std::endl;
>> }
>> ---------------------------------------------------------------------
>>
>> outputs
>>
>> ------------------
>> v = 4.6
>> v*100 = 460
>> floor(v*100) = 459
>> ------------------
>>
>> It that a bug?

There is a boring and excruciatingly long paper floating (ha!) around:
"What Every Computer Scientist Should Know About Floating-Point Arithmetic"
https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

This other site tries to be more accessible:
http://floating-point-gui.de/

The short version is that it is not possible to represent 0.1
(or any multiple thereof) in (fractional) base 2.

Basically, using "IEEE 754 double-precision binary floating-point format"
4.6 is approximated as D=4.5999999999999996447286321199499070644378662109375
( https://en.wikipedia.org/wiki/Double-precision_floating-point_format )

Thus, it is obvious why floor(D*100) equals 459.

Regards.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]