浮点数等式检查

时间:2013-08-09 07:56:14

标签: c floating-point

使用以下代码

#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

为什么输出会有差异?

5 个答案:

答案 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()帽子的理论上,但可能不满意的答案是:

  • 因为浮点数是有限的,因此不等于我们在数学中使用的R http://mathurl.com/mgwavz7数字(以及现实世界中的大部分)。
  • 浮点数是二进制而不是十进制,所以有些分数在十进制表示中是有限的,但是重复或超越(如Pi http://mathurl.com/62kzla或自然对数 e 的基数)二进制(或基数2)。

@Jens