【问题标题】:C - Comparison of integer 0 vs float 0.000000C - 整数 0 与浮点数 0.000000 的比较
【发布时间】:2014-12-12 16:42:03
【问题描述】:

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

我猜这是由于浮动数字,可能是 intfloat 演员,但我仍然希望有人向我解释这是正常行为,以及为什么。

这是我的 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 行。
  • 我没有发现任何问题。 FLT_MIN 是大于零的最小可表示浮点数。另见stackoverflow.com/questions/2528039/…
  • 尝试用%e 代替%f 打印FLT_MIN
  • @OldProgrammer 我的错。这是«为什么没有出现“3-”行»。谢谢。
  • FLT_MIN 不是零 - 它是可以用float 表示的大于零的最小数字。由于四舍五入,它打印为0.000000

标签: c int comparison


【解决方案1】:

您的困惑可能超出了界限:

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

改成:

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

您会看到,FLT_MIN 实际上不是零,而是比零大的(微小的位)。

【讨论】:

    【解决方案2】:

    FLT_MIN 不是 0,只是高于 0,你只需要显示更多的地方才能看到。 FLT_MIN 是计算机可以表示的大于 0 的最小浮点数,因为浮点数几乎总是一个近似值,printf 和朋友在打印时会四舍五入,除非你要求它的精度:

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

    3 实际上并没有出现在您的输出中,因为 0 不小于 0

    4 比较 0 和 0,计算机表示这两者没有问题(0 是浮点数的特殊情况)所以它们比较相等

    7 与 4 相同,只是中间赋值

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-05-30
        • 2011-04-19
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多