我有以下代码,
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
。我假设有一个关于双常数和浮点数的标准,即它们中的任何一个在评估时会变得更大。但是这两个代码澄清了我,当双常数变大并且其他时候浮点变大时,情况可能会出现。这背后有没有四舍五入的问题?如果是,请解释我。我非常需要这个明确的..
谢谢提前
答案 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_point和http://en.wikipedia.org/wiki/IEEE_754了解详情。