为什么FLT_MIN等于零?

时间:2010-03-27 03:28:43

标签: c floating-point numeric-limits

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等于零而不是一个非常大的负数?

4 个答案:

答案 0 :(得分:53)

实际上并非零,但如果您使用printfNSLog使用%f进行检查,则可能看起来为零。 根据{{​​1}}(至少在Mac OS X 10.6.2中),float.h被描述为:

FLT_MIN

请注意该句中的肯定/* Minimum normalized positive floating-point number, b**(emin - 1). */ 是指最小(标准化)数大于零。 (有非常小的非标准化数字)。

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

答案 1 :(得分:12)

'%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

答案 2 :(得分:1)

为什么FLT_MIN等于零?

不是,由于使用0.000000而显示为"%f",该.FLT_MIN之后打印6个十进制数字。
FLT_TRUE_MIN, FLT_MIN, FLT_MAX的值通常约为1.17549435e-38。


参考

尽管已经回答了有关为什么的问题,但我认为我会在{{1}时发布float及其最近的float邻居的 exact 值}是binary32

// 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

答案 3 :(得分:0)

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

我已经使用%.54f(取决于机器)来获得所需的- 结果(对于我的系统,为0.000000000000000000000000000000000000000000011754943508222875)。

//在您的系统上进行检查

#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

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