C - 整数0与浮点数0.000000的比较

时间:2014-12-12 16:42:03

标签: c int comparison

我刚刚遇到了一个我不会在我正在使用的C程序中理解的行为。

我想这是由于浮动数字,可能是intfloat,但我还是希望有人向我解释这是正常的行为,为什么。< / p>

这是我的C程序:

#include <stdio.h>
#include <float.h>

int main ()
{
  printf("FLT_MIN : %f\n", FLT_MIN);
  printf("FLT_MAX : %f\n", FLT_MAX);

  float valueFloat = 0.000000;
  int valueInt = 0;

  if (valueInt < FLT_MIN) {
        printf("1- integer %d < FLT_MIN %f\n", valueInt, FLT_MIN);
  }
  if (valueFloat < FLT_MIN) {
        printf("2- float %f < FLT_MIN %f\n", valueFloat, FLT_MIN);
  }

  if (0 < 0.000000) {
    printf("3- 0 < 0.000000\n");
  } else if (0 == 0.000000) {
    printf("4- 0 == 0.000000\n");
  } else {
    printf("5- 0 > 0.000000\n");
  }

  if (valueInt < valueFloat) {
    printf("6- %d < %f\n", valueInt, valueFloat);
  } else if (valueInt == valueFloat) {
    printf("7- %d == %f\n", valueInt, valueFloat);
  } else {
    printf("8- %d > %f\n", valueInt, valueFloat);
  } 


  return 0;
}

这是我编译和运行它的命令:

gcc float.c -o float ; ./float

这是输出:

FLT_MIN : 0.000000
FLT_MAX : 340282346638528859811704183484516925440.000000
1- integer 0 < FLT_MIN 0.000000
2- float 0.000000 < FLT_MIN 0.000000
4- 0 == 0.000000
7- 0 == 0.000000

我知道C开发人员认为线"1-"显示正常,在比较中会失去精确度。我们承认这一点。

  • 但为什么行"3-"不会出现,因为它是相同的比较?
  • 为什么会出现"2-"行,因为我正在比较相同的数字? (或者至少我希望如此)
  • 为什么会出现"4-""7-"行?这似乎与行"1-"不同。

感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

你的困惑可能在线:

printf("FLT_MIN : %f\n", FLT_MIN);

将其更改为:

printf("FLT_MIN : %g\n", FLT_MIN);

你会看到,FLT_MIN实际上不是零,而是一个大于零的(微小的)。

答案 1 :(得分:3)

FLT_MIN不是0,它刚刚超过0,你只需要显示更多地方即可。 FLT_MIN是计算机可以表示的0以上的最小浮点数,因为浮点几乎总是近似值,printf和朋友在打印时是圆的,除非你问它的精度:

printf("FLT_MIN : %.64f\n", FLT_MIN);

3实际上不会出现在输出中,因为0不小于0

4将0与0进行比较,计算机没有问题代表两者(0是浮点数的特殊情况)所以他们比较相等

7与4只是中间分配相同的情况

答案 2 :(得分:2)

这是正确的行为。在IEEE754下,零可以表示为浮点数。因此它可以与整数零“相等”(尽管“等价”将是一个更好的术语)。 FLT_MIN是可以表示为float的最小幅度数,仍然可以与零区分开。即使printf()的标准%f格式说明符将FLT_MIN显示为0.000000,但为零。文字0.00 ...将由编译器解释为float 0,它不等于FLT_MIN,即使默认的六位小数%f格式将打印它们相同。