当前位置: 首页 > 知识库问答 >
问题:

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

唐修诚
2023-03-14

在C中比较相同的浮点值

比较float和float literal的奇怪输出

我读了上面关于浮点的链接,但甚至得到奇怪的输出。

#include<stdio.h>
int main()
{
    float x = 0.5;

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

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

    else
        printf("ELSE");
}

现在按照推广规则,“其他如果”难道不是必须印出来的吗?

但是,这里是打印“if”

共有1个答案

闻人志
2023-03-14

浮点数永远不准确。

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

在您的特定情况下,浮点x=0.5将导致x具有1.00000000*2^-1值。当您将其与double 0.5进行比较时,两个操作数都转换为double,因此比较变为1.0000000000000000000*2^-1==1.00000000000000000*2^-1,这将成功。

对于float x=0.1,它看起来不一样。该值存储为1.01010101*2^-3(或类似)。注意,这已经不精确了。当您将此与double 0.1进行比较时,浮点数在末尾以零扩展,则比较变为1.010101010000000*2^-3==1.010101010101010101010*2^-3,这将失败。

 类似资料:
  • 问题内容: 我刚刚阅读了有关浮点值比较的声明 不得使用==或!=运算符比较浮点值。大多数浮点值没有精确的二进制表示形式,并且精度有限。 如果是这样,比较两个浮点值的最佳方法是什么? 问题答案: 以下扩展方法对于实现Kevin的建议可能有用: 现在,您可以执行以下操作: 只需将更改为更合适的名称,或在需要时将默认边距更改为比更好的值。

  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?

  • 问题内容: 我遇到此行的问题(在下面评论): 输出。 但是,输出。 现在,我不明白为什么我得到这个结果: 问题答案: 您缺少一组括号: 在您的版本中,正在通过与进行比较,这不是您想要的。 通常,的优先级高于,这就是为什么将其评估为的原因。

  • 在C中,如果我们执行以下代码: 上面的代码打印“更少”。 但如果我们执行以下代码: 它打印“否”。 原因是什么?浮点数据类型是如何工作的?

  • 我知道使用是因为分辨率无关的坐标系。 与,,,,比较时不是容易出现误报吗?它是一个浮点,它们有不精确的问题:例如。 在比较时是否在内部处理这个问题,或者是否会发生读取为零的与不比较为true的情况?

  • 问题内容: 我正在使用jmh 使用maven并按照http://openjdk.java.net/projects/code- tools中 建议的命令行方法对一个简单的应用程序进行基准测试。成功设置并建立基准后,我可以使用avgt模式获得以下基准结果: 我不确定如何解释此输出,但我确定某些地方出了错…?知道什么或如何调试吗? 问题答案: JMH输出使用扩展的Unicode字符。特别是, ?10