C compiler bug (floating point arithmetic)?

后端 未结 3 1456
北海茫月
北海茫月 2020-12-04 04:26
#include

int main()
{
    double fract=0;
    int tmp;

    //scanf(\"%lf\",&fract);
    fract=0.312;
    printf(\"%lf\",fract);
    printf(\"\\n         


        
相关标签:
3条回答
  • 2020-12-04 04:30

    Kernighan & Plauger say, in their old but classic book "The Elements of Programming Style", that:

    • A wise old programmer once said "floating point numbers are like little piles of sand; every time you move one, you lose a little sand and gain a little dirt".

    They also say:

    • 10 * 0.1 is hardly ever 1.0

    Both sayings point out that floating point arithmetic is not precise.

    Note that some modern CPUs (IBM PPC) have IEEE 754:2008 decimal floating point arithmetic built-in. If using the correct types, then your calculation will be exact.

    0 讨论(0)
  • 2020-12-04 04:39

    So you multiplied 0.3119999999999999999895916591441391574335284531116485595703125 by 1000 and truncated it and got 311? I don't see where the problem is.

    0 讨论(0)
  • 2020-12-04 04:53

    Floating-point arithmetic is confusing, and not guaranteed to behave intuitively.

    Here's a good reference document: What Every Computer Scientist Should Know About Floating-Point Arithmetic. It's a long document, because it's a complicated problem.

    In summary: Don't use floating-point values if you are relying on exact values.

    0 讨论(0)
提交回复
热议问题