使用以下代码
#include <stdio.h>
int main(void){
float x;
x=(float)3.3==3.3;
printf("%f",x);
return 0;
}
输出为0.00000
但是当数字3.3替换为3.5时,
#include <stdio.h>
int main(void){
float x;
x=(float)3.5==3.5;
printf("%f",x);
return 0;
}
输出为1.0000
为什么输出会有差异?
答案 0 :(得分:9)
你应该明白,在C中,文字3.3的类型为double。将double转换为float可能会失去精度,因此3.3F与3.3的比较会产生错误。对于3.5,转换是无损的,因为两者都可以精确表示,并且比较结果为真。
它与(基数10而不是基数2)比较
有些相关3.3333333 with 3.3333333333333333 (false)
3.5000000 with 3.5000000000000000 (true)
答案 1 :(得分:5)
由于舍入错误,大多数浮点数字最终略微不精确。只要这种不精确度保持很小,通常可以忽略它。但是,它也意味着期望相等的数字(例如,通过不同的正确方法计算相同的结果时)通常略有不同,并且简单的相等测试失败。
在您的情况下,将double
转换为float
会失去一些精确度。
比较浮点时必须非常小心。
我建议你看一下这个链接:What is the most effective way for float and double comparison?
本文可以帮助您了解其追加的原因:http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point_representation.html
关于浮点数的一点解释以及为什么会发生这种情况:
浮点数通常作为符号位,指数字段和有效数字(尾数)打包到计算机数据中,从左到右。
基本上,你可以说浮点数是:
number = (sign ? -1:1) * 2^(exponent) * 1.(mantissa bits)
当然,根据您使用 float 还是 double ,精度会有所不同:
| Sign | Exponent | Significand | Total bits
float | 1 | 8 | 23 | 32
Double | 1 | 11 | 52 | 64
在这里,您可以看到为什么通过将double转换为float来丢失一些数据。
在您的情况下,似乎计算机能够精确计算3.5,但不能计算3.3。 不知何故,通过公式,我们可以假设您正在做类似的事情:
3.3333333 == 3.333333333333333 // is false because of the precision
3.5000000 == 3.500000000000000 // is true
// I tried to match the precision of the float in the left
// and the precision of the double on the right
答案 2 :(得分:4)
==执行相等检查。浮点数的平等检查存在问题(参见http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm)
)所以,一旦你得到一个假,一旦你得到一个真(1)。
有关比较浮点数的更强大的方法,请参阅 - What is the most effective way for float and double comparison?
答案 3 :(得分:4)
区别在于3.5可以完全表示为二进制浮点数,而3.3不能。
由于数学3.3无法准确表示,3.3
作为双精度数,是一个比单精度数(float)3.3
更好的近似值,因此具有不同的值。
答案 4 :(得分:0)
Why is there a difference in output?
戴着Math / CS(numerical-analysis)帽子的理论上,但可能不满意的答案是:
@Jens