【问题标题】:float value condition [duplicate]浮点值条件[重复]
【发布时间】:2013-03-26 13:37:23
【问题描述】:

我编写了以下代码并得到了一个奇怪的输出。谁能解释一下它是如何工作的?

main()
{
    float a=0.8;
    float b=0.25;
    if(a==0.8)
        printf("HELLO")
    if(b==0.25)
        printf("WORLD")
}

我得到的输出令人惊讶

WORLD

提前致谢

【问题讨论】:

    标签: c floating-point floating-point-conversion


    【解决方案1】:

    这是因为 0.25 是 2 的幂(即 2^-2),而 0.8 不是。只有 2 的幂的精确和才能精确表示;所有其他数字(包括 0.8)都表示为近似值,在 floatdouble 之间具有不同的精度。 a==0.8 中的 0.8double,而 afloat。它们的表示不同,它们的值也不同。

    【讨论】:

    • 你是 SO 中最快的枪,伙计。我点击了“发布你的答案”,我真的很快。
    • 只需添加一个 printf("%1.12f", a);到你的代码,你会看到舍入错误
    【解决方案2】:

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

    请查看 here 以获得您的解释,尤其是舍入规则。

    【讨论】:

    • 这里有什么问题???为什么投反对票?
    • 现在你得到另一个抱怨:​​p
    • 还是不明白...
    • 我没有投票给你...
    【解决方案3】:

    您将浮点数与双精度数进行比较。试着在数字后面加一个 f

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

    【讨论】:

      【解决方案4】:

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

      its-hard-to-compare-floating-point-numbers

      comparing-an-integer-with-a-floating-point1

      【讨论】:

      • 我在这两篇文章中没有看到手头问题的答案。答案是a0.8f 并且0.8f 不同于双精度常量0.8
      【解决方案5】:

      一切最终都存储在位中......所以浮点数会被四舍五入,以防它们的二进制等价物重复出现......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 2011-07-02
        • 2021-01-11
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多