4

使用以下代码,

#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

为什么输出有差异?

4

5 回答 5

10

You should understand that in C the literal 3.3 has type double. Converting a double to a float may lose precision, so the comparison of 3.3F with 3.3 yields false. For 3.5 the conversion is lossless since both can be represented exactly and the comparison yields true.

It's somewhat related to (in base 10 instead of base 2) comparing

3.3333333 with 3.3333333333333333  (false)
3.5000000 with 3.5000000000000000  (true)
于 2013-08-09T08:02:17.107 回答
5

由于舍入误差,大多数浮点数最终会稍微不精确。只要这种不精确性很小,通常可以忽略不计。然而,这也意味着预期相等的数字(例如,当通过不同的正确方法计算相同的结果时)通常会略有不同,并且简单的相等性测试会失败。

在您的情况下,将 a 转换为doublefloat失去一些精度。

比较浮点数时必须非常小心。

我建议你看看这个链接:浮点和双重比较最有效的方法是什么?

这篇文章可以帮助你理解它为什么附加: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

在这里,您可以了解为什么将双精度数转换为浮点数可能会丢失一些数据。

在您的情况下,计算机似乎能够精确计算 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
于 2013-08-09T08:07:35.880 回答
4

== 执行相等性检查。浮点数的平等检查有问题(请参阅http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm)

所以,一旦你得到一个假的,一旦你得到一个真(1)。

有关比较浮动的更强大的方法,请参阅 -浮动和双重比较最有效的方法是什么?

于 2013-08-09T08:01:16.440 回答
4

不同之处在于 3.5 可以精确地表示为二进制浮点数,而 3.3 不能。

由于数学 3.3 不能精确表示,3.3作为双精度数,比单精度数更接近(float)3.3,因此具有不同的值。

于 2013-08-09T08:09:48.187 回答
0

Why is there a difference in output?

A theoretical, but probably unsatisfying answer wearing a Math / CS () hat is:

  • Because floating point numbers are finite, and thus not equal to the R http://mathurl.com/mgwavz7 numbers we are use to in mathematics (and much of the real world).
  • Floating point numbers are binary as opposed to decimal, so some fractions that are finite in decimal representation, but are repeating or transcendental (like Pi http://mathurl.com/62kzla or the base of the natural logarithm e) in binary (or radix 2).

@Jens

于 2013-08-09T20:08:51.173 回答