【问题标题】:Why is FLT_MIN equal to zero?为什么 FLT_MIN 等于 0?
【发布时间】:2011-02-01 10:50:07
【问题描述】:

limits.h 指定非浮点数学类型的限制,例如INT_MININT_MAX。这些值是您可以使用 int 表示的最负值和最正值。

float.h 中,有FLT_MINFLT_MAX 的定义。如果您执行以下操作:

NSLog(@"%f %f", FLT_MIN, FLT_MAX);

你会得到以下输出:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000

FLT_MAX 等于一个非常大的数字,如您所料,但为什么 FLT_MIN 等于零而不是一个非常大的负数?

【问题讨论】:

  • FLT_MIN 在我的机器上是1.17549435e-38F
  • 您如何检查值?在某处查找头文件?使用 printf? (如果你使用 printf,你就没有使用“%f”,对吗?你会希望“%e”得到指数符号。)
  • 我更新了 Q 和 A 以澄清 %f printf 问题。
  • 试试printf("FLT_MIN: %.100f\n", FLT_MIN);
  • @SlippD.Thompson 尝试阅读现有答案 ;-)

标签: c floating-point numeric-limits


【解决方案1】:

为什么FLT_MIN 等于零?

它不等于零。它显示为 0.000000,因为使用了 "%f",它在小数点后打印 6 个小数位 .
FLT_MIN 的值通常约为 1.17549435e-38。


参考

虽然这个问题已经回答了为什么,但我想我会发布FLT_TRUE_MIN, FLT_MIN, FLT_MAX精确 值,以及当floatbinary32 时它们最近的float 邻居的值。

// Approximate value, exact value
Before, FLT_TRUE_MIN, after
 0.00000000e+00 0.0
 1.40129846e-45 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125
 2.80259693e-45 0.0000000000000000000000000000000000000000000028025969286496341418474591665798322625605238837530315435141365677795821653717212029732763767242431640625
Before, FLT_MIN, after
 1.17549421e-38 0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875
 1.17549435e-38 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625
 1.17549449e-38 0.00000000000000000000000000000000000001175494490952133940450443629595204006810278684798281709160328881985245648433835441437622648663818836212158203125
Before, FLT_MAX, after
 3.40282326e+38 340282326356119256160033759537265639424.0
 3.40282347e+38 340282346638528859811704183484516925440.0
            inf inf

【讨论】:

    【解决方案2】:

    每当您尝试从标准头文件中打印 FLT_MIN 的值时 float.h ,您将获得 0.000000(正如您在输出屏幕中看到的那样)。 这实际上不是一个错误。你得到这个结果是因为格式说明符 %f。 通常 %f 在小数点后打印 6 位,但在这种情况下,带符号的负值非常小,您需要在小数点后打印大量数字。

    我已经使用 %.54f(machinedependent) 来获得所需的 - 结果(我的系统为 0.000000000000000000000000000000000000011754943508222875)。

    //在你的系统上检查这个

    #include<stdio.h>
    #include<float.h>
    int main()
    {
        printf("Minimum signed float %.55f\n",FLT_MIN);
        printf("Minimum signed float %e\n",FLT_MIN);
        return 0;
    }
    

    //输出:-

    // 最小有符号浮点数 0.0000000000000000000000000000000000000117549435082228750

    // 最小有符号浮点数 1.175494e-038

    我想你现在很清楚为什么 CHAR_MIN 得到 0.000000 以及如何 使用相同的格式说明符获得正确的结果。尽管您可以使用 %e 获得更好的格式化结果。

    【讨论】:

      【解决方案3】:

      它实际上并不为零,但如果您使用printfNSLog 使用%f 来检查它,它可能看起来像零。
      根据float.h(至少在 Mac OS X 10.6.2 中),FLT_MIN 被描述为:

      /* Minimum normalized positive floating-point number, b**(emin - 1).  */
      

      注意那句话中的FLT_MIN 指的是最小(标准化)数大于零。 (还有更小的非归一化数字)。

      如果您想要最小浮点数(包括负数),请使用-FLT_MAX

      【讨论】:

      • 这对我来说似乎不是一个答案——我认为你的问题是为什么它是零而不是一个非常小的和积极的东西。
      • 我已经更新了答案 - 你绝对正确,它不为零。我将更新问题以反映当您执行 printf 时它看起来为零,而不是实际上为零。
      • 注释中的文本“最小归一化正浮点数,b**(emin - 1)”直接不符合 C 标准,适用于任何 C 实现(参见ISO/IEC 9899:TC2 5.2.4.2.2/11)。
      • @Nick:如果你使用指数符号,它看起来并不像零。
      • FLT_MIN 指的是最小的标准化正浮点数。最小正浮点数是一个非规范化的数字,即 2^(-149) ≈ 1.4013e-45。
      【解决方案4】:

      '%f' 格式以固定格式打印 6 位小数。由于 FLT_MIN 要小得多,因此它在定点上看起来为零。如果你使用 '%e' 或 '%g' 格式,你会得到一个格式更好的答案。与 FLT_MAX 类似。

      #include <float.h>
      #include <stdio.h>
      int main(void)
      {
          printf("MIN = %f, MAX = %f\n", FLT_MIN, FLT_MAX);
          printf("MIN = %e, MAX = %e\n", FLT_MIN, FLT_MAX);
          return(0);
      }
      
      
      MIN = 0.000000, MAX = 340282346638528859811704183484516925440.000000
      MIN = 1.175494e-38, MAX = 3.402823e+38
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-03
        • 2012-11-11
        • 1970-01-01
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多