C编译器bug(浮点运算)?

时间:2010-10-23 04:02:30

标签: c floating-point

#include<stdio.h>

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

    //scanf("%lf",&fract);
    fract=0.312;
    printf("%lf",fract);
    printf("\n\n");
    while(fract>0){
        fract*=(double)10;
        printf("%d ",(int)fract);
        fract-=(int)fract;
    }
    getch();
    return 0;
}

此代码应输出: 312

但是somehing不对..我正在使用devcpp 4.9.9.2编译器......

3 个答案:

答案 0 :(得分:12)

Kernighan&amp;普劳格在他们古老但经典的书"The Elements of Programming Style"中说:

  • 一位聪明的老程序员曾经说过“浮点数就像一堆沙子;每次移动一个,你就会失去一点沙子并获得一点污垢”。

他们还说:

  • 10 * 0.1几乎不是1.0

两种说法都指出浮点运算不精确。

请注意,一些现代CPU(IBM PPC)内置了IEEE 754:2008十进制浮点运算。如果使用正确的类型,那么您的计算将是准确的。

答案 1 :(得分:6)

浮点运算令人困惑,并且无法保证直观行为。

这是一份很好的参考文件:What Every Computer Scientist Should Know About Floating-Point Arithmetic。这是一份很长的文件,因为这是一个复杂的问题。

总结:如果您依赖于完全值,请不要使用浮点值。

答案 2 :(得分:6)

所以你乘以1000乘以0.3119999999999999999895916591441391574335284531116485595703125并截断它并得到311?我不知道问题出在哪里。