29

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

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

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

您会得到以下输出:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000

FLT_MAX正如您所期望的那样,等于一个非常大的数字,但是为什么FLT_MIN等于零而不是一个非常大的负数呢?

4

4 回答 4

58

它实际上不是零,但如果您使用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.

于 2010-03-27T03:30:53.250 回答
15

'%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
于 2010-03-27T03:45:30.897 回答
2

每当您尝试从标准头文件 float.h 打印 FLT_MIN 的值时,您将得到 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 获得更好的格式化结果。

于 2019-05-03T17:13:18.440 回答
1

为什么FLT_MIN等于零?

它不等于零。它似乎是0.000000由于使用"%f"which 在小数点后打印 6 位小数.
FLT_MIN通常具有大约 1.17549435e-38 的值。


参考

虽然这个问题已经回答了为什么,但我想我会在binary32时发布它们的确切FLT_TRUE_MIN, FLT_MIN, FLT_MAX以及它们最近的float邻居。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
于 2020-04-27T19:52:29.667 回答