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

pri*_*ner 0 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;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的输出为:312

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

Jon*_*ler 12

Kernighan&Plauger在他们古老但经典的书"编程风格的元素"中说:

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

他们还说:

  • 10*0.1几乎不是1.0

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

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


Joh*_*eek 6

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

这是一个很好的参考文档:每个计算机科学家应该知道的浮点运算.这是一份很长的文件,因为这是一个复杂的问题.

总结:如果您依赖于确切的值,请不要使用浮点值.


R..*_*R.. 6

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