Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 浮点值条件_C_Floating Point_Floating Point Conversion - Fatal编程技术网

C 浮点值条件

C 浮点值条件,c,floating-point,floating-point-conversion,C,Floating Point,Floating Point Conversion,我算出了下面的代码,得到了一个奇怪的输出。有人能解释一下它是如何工作的吗 main() { float a=0.8; float b=0.25; if(a==0.8) printf("HELLO") if(b==0.25) printf("WORLD") } 我得到的结果令人惊讶 WORLD 提前感谢这是因为0.25是2的幂,即2^-2,而0.8不是。只有二次幂的精确和才能精确表示;所有其他数字,包括0.8,都表示为近似值,其精

我算出了下面的代码,得到了一个奇怪的输出。有人能解释一下它是如何工作的吗

main()
{
    float a=0.8;
    float b=0.25;
    if(a==0.8)
        printf("HELLO")
    if(b==0.25)
        printf("WORLD")
}
我得到的结果令人惊讶

WORLD

提前感谢

这是因为0.25是2的幂,即2^-2,而0.8不是。只有二次幂的精确和才能精确表示;所有其他数字,包括0.8,都表示为近似值,其精度在float和double之间有所不同。a==0.8中的0.8是双精度,而a是浮点。它们的表示方式不同,它们的值也不同。

您决不能像以前那样将浮点值与绝对值进行比较。通常存在轻微的舍入误差,因为根据IEEE 754表示浮点数,并且机器无法提供精确的浮点数


看看你的解释,特别是四舍五入规则。

给出的答案是正确的。。。在Dobb博士的Andrew Koenig写的关于浮动的订单关系的文章中,有一个观点:


您正在比较float和double。试着在数字后面加一个f

if(a==0.8f)
    printf("HELLO")
if(b==0.25f)
    printf("WORLD")

所有东西最终都存储在位中。。。。所以浮点值会被四舍五入,以防它们的二进制等价物重复出现

你是世界上最快的枪,伙计。我正在点击发布你的答案,我真的很快。只需添加一个printf%1.12f,a;到您的代码,您将看到舍入错误这里有什么问题???为什么投反对票?现在你又因为抱怨得到了另一个:pStill不明白…我没有投你反对票…我在这两篇文章中看不到问题的答案。答案是a是0.8f,0.8f不同于双精度常数0.8。