-1

可能重复:
float 与 float 文字
比较的奇怪输出 float 和 double 变量的比较

我在 C 中使用 double 和 float 进行了测试,但我无法解释原因。

    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。请为我解释一下。

4

5 回答 5

5

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

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

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

于 2012-06-26T07:42:41.850 回答
5

3.4 不能精确地表示为双精度数,原因与三分之一不能使用有限位数精确地表示为以 10 为底的十进制数的原因相同——这种表示重复出现。

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

当您将浮点数与双精度数进行比较时,浮点数将转换为双精度数,这不会改变其值。

因此,3.4F != 3.4,正如0.3333 != 0.33333333

于 2012-06-26T07:54:36.113 回答
2

不能保证结果是假的和真的,但基本的想法很简单:3.4类型为 double。当你将它分配给 afloat时,它会被四舍五入。当您比较时,该四舍五入的数字将被提升回双精度数,不一定3.4.

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

于 2012-06-26T07:43:37.953 回答
0

比较相等 浮点数学并不精确。像 0.2 这样的简单值不能用二进制浮点数精确表示,而浮点数的精度有限意味着运算顺序的微小变化可能会改变结果。不同的编译器和 CPU 架构以不同的精度存储临时结果,因此结果会因环境的详细信息而异。如果您进行计算,然后将结果与某个预期值进行比较,那么您将不太可能得到您想要的结果。

换句话说,如果你做一个计算然后做这个比较: if (result == expectedResult)

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

于 2012-06-26T07:43:54.750 回答
0

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

最好使用类似的东西:

abs(x - y) < EQUALITY_MARGIN

EQUALITY_MARGIN 是一个足够小的数字。

于 2012-06-26T09:13:34.323 回答