有人能简单地解释一下这个功能吗?

时间:2012-07-10 21:15:18

标签: c floating-point double rounding

我有以下代码,

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 个答案:

答案 0 :(得分:11)

你所拥有的是representation error

要了解发生了什么,您可能会发现更容易首先考虑以不同精度(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

提高精度可使数字略大,略小或具有相同的值。

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

答案 1 :(得分:4)

float a = 0.7;

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

同样适用于0.98。有时,最接近的单精度值大于小数,最接近的双精度数值较小,有时则相反。

答案 2 :(得分:3)

答案 3 :(得分:1)

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

虽然存在无限数量的浮点数,但由于位约束,没有无限数量的浮点表示。因此,以这种方式使用浮点数时会出现舍入误差。

没有标准可以决定向上或向下舍入,这可能是语言 - 实现或编译器相关。

请参阅此处:http://en.wikipedia.org/wiki/Floating_pointhttp://en.wikipedia.org/wiki/IEEE_754了解详情。