0

我有以下代码,

float a = 0.7;
if(0.7 > a)
    printf("Hi\n");
else
    printf("Hello\n");   //Line1

float a = 0.98;
if(0.98 > a)
    printf("Hi\n");
else
    printf("Hello\n");   //Line2

这里 line1 输出Hi但 Line2 输出Hello。我假设对于双常数和浮点数会有一定的标准,即它们中的任何一个在评估时都会变得更大。但是这两个代码澄清了当双常数变大而其他时候浮点变大时可能会出现这种情况。这背后有什么四舍五入的问题吗?如果是,请解释一下。我非常需要这个明确的..提前谢谢

4

4 回答 4

11

您所拥有的称为表示错误

要查看发生了什么,您可能会发现首先考虑以不同精度(3 位小数或 6 位小数)存储的 1/3、1/2 和 2/3 的十进制表示更容易:

a = 0.333
b = 0.333333
a < b

a = 0.500
b = 0.500000
a == b

a = 0.667
b = 0.666667
a > b

增加精度可以使数字略大、略小或具有相同的值。

相同的逻辑适用于二进制浮点数。

于 2012-07-10T21:21:44.253 回答
4
float a = 0.7;

现在a是最接近 0.7 的单精度浮点值。对于0.7 > a提升到的比较double,由于常量的类型0.7double,并且它的值是最接近 0.7 的双精度浮点值。这两个值是不同的,因为 0.7 不能精确表示,所以一个值大于另一个值。

这同样适用于0.98。有时,最接近的单精度值大于十进制小数,而最接近的双精度数更小,有时反之亦然。

于 2012-07-10T21:22:43.600 回答
3

这是每个计算机科学家都应该知道的关于浮点运算的一部分。

于 2012-07-10T21:28:22.790 回答
1

这只是浮点精度的问题之一。

虽然有无限数量的浮点数,但由于位限制,浮点表示不是无限数量的。所以以这种方式使用浮点数时会出现舍入误差。

对于决定向上或向下舍入的位置没有标准,这可能取决于语言实现或编译器。

请参阅此处:http ://en.wikipedia.org/wiki/Floating_point和http://en.wikipedia.org/wiki/IEEE_754了解更多详细信息。

于 2012-07-10T21:21:07.283 回答