C:使用float和double时出现奇怪的错误

时间:2012-06-26 07:40:23

标签: c floating-point

  

可能重复:
  strange output in comparision of float with float literal
  Comparison of float and double variables

我有一个带有double的测试并且在C中浮动,但我无法解释原因。

    float x = 3.4F;
    if(x==3.4)
        printf("true\n");
    else printf("false\n");
    double y = 3.4;
    if (y==3.4)
        printf("true\n");
    else printf("false\n");

结果将为False和True。请帮我解释一下。

5 个答案:

答案 0 :(得分:5)

x == 3.4应为x == 3.4F,否则3.4为双倍(默认情况下)。总是比较喜欢,而不是苹果和橘子。

编辑: 不同精度类型之间的比较结果是真还是假取决于编译器的浮点表示。

浮点数,无论是单精度(浮点数)还是双精度,都是近似值。

答案 1 :(得分:5)

3.4不能精确地表示为double,原因与三分之一不能使用有限位数精确表示为10的十进制数一样 - 表示重复出现。

因此,双字面3.4实际上是最接近3.4的双精度值。 3.4F是最接近3.4的浮点值,但与最接近的double值不同。

当你将float与double进行比较时,float会转换为double,而不会改变它的值。

因此,3.4F != 3.4,就像0.3333 != 0.33333333

一样

答案 2 :(得分:2)

不保证结果是错误的和真实的,但基本的想法非常简单:3.4的类型为double。当您将其分配给float时,它将被舍入。比较时,该舍入后的数字将被提升为双倍,而不一定是{em>相同的倍数,而不是3.4

在第二种情况下,一切都是双倍的。

答案 3 :(得分:0)

比较平等 浮点数学并不准确。像0.2这样的简单值无法使用二进制浮点数精确表示,浮点数的有限精度意味着操作顺序的微小变化可能会改变结果。不同的编译器和CPU架构以不同的精度存储临时结果,因此结果将根据您的环境的详细信息而有所不同。如果您进行计算,然后将结果与某些预期值进行比较,那么您很可能无法获得预期的结果。

换句话说,如果您进行计算然后进行此比较: if(result == expectedResult)

那么比较不太可能。如果比较为真,那么它可能不稳定 - 输入值,编译器或CPU的微小变化可能会改变结果并使比较成为假。

答案 4 :(得分:0)

作为提示,将浮点数(浮点数或双精度数)与'=='进行比较在大多数情况下是一种糟糕的编程习惯,因为您可能永远不会认为该语句是真的。这两个数字的最低有效位可能不同。

最好使用以下内容:

abs(x - y) < EQUALITY_MARGIN

EQUALITY_MARGIN 是一个足够小的数字。