当前位置:  开发笔记 > 编程语言 > 正文

比较相同的浮点数时奇怪的输出?

如何解决《比较相同的浮点数时奇怪的输出?》经验,为你挑选了2个好方法。

比较C中的相同浮点值

与float和float文字相比较的奇怪输出

浮动添加提升到双倍?


我在浮点上阅读了上面的链接,但是甚至得到了奇怪的输出.

#include
int main()
{
    float x = 0.5;

    if (x == 0.5)
        printf("IF");

    else if (x == 0.5f)
        printf("ELSE IF");

    else
        printf("ELSE");
}

现在,根据促销规则,不应该打印" ELSE IF "吗?

但是,这里是打印" IF "


编辑:是因为0.5 = 0.1二进制,之后一切都为0并且精度损失因此没有影响,因此比较IF返回true.

如果它是0.1,0.2,0.3,0.4,0.6,0.7 ....那么Else If块返回true.


请原谅我提出同样的问题,因为我已经从上面的链接中读到,浮动比较绝对不能完成.

但是,这种意外行为的原因是什么?



1> Gerhardh..:

当您阅读有关浮点类型和比较问题的链接时,您可能期望在转换期间舍入0.5,因此比较应该失败.但是0.5是2的幂,并且可以完美地表示,而不需要在float或double类型变量中进行任何舍入.因此比较结果为TRUE.

在您编辑完问题之后:是的,如果您使用了0.1或您提到的其他值,则应该遇到其他部分.



2> Roland Illig..:

浮点数永远不准确.

这种说法是错误的.一些浮点数是准确的,例如1.0,12345.0,12345.5,-2.25.所有这些数字都可以表示为2的幂的整数.所有数字都不能准确.

在您的具体情况下,float x = 0.5结果x具有该值1.00000000 * 2^-1.当你比较它时double 0.5,两个操作数都被转换为double,所以比较变为1.000000000000000 * 2^-1 == 1.000000000000000 * 2^-1成功.

因为float x = 0.1,它看起来不同.该值存储为1.01010101 * 2^-3(或类似).请注意,这已经不准确了.当你比较它时double 0.1,浮点数在末尾用零加长,比较变为1.010101010000000 * 2^-3 == 1.010101010101010 * 2^-3,失败.


我实际上会说所有浮点数都是准确的.它用十进制表示法表达它们是不准确的.问题不在于数字,问题是将它们转换为十进制字符串.如果我们只将整数表示为3的分数,那么它们也是"不准确的".
推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有