为什么FLT_MIN等于零?

Nic*_*rge 27 c floating-point numeric-limits

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

float.h有相关定义FLT_MINFLT_MAX.如果您执行以下操作:

NSLog(@"%f %f", FLT_MIN, FLT_MAX);
Run Code Online (Sandbox Code Playgroud)

您将获得以下输出:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*rge 55

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

/* Minimum normalized positive floating-point number, b**(emin - 1).  */
Run Code Online (Sandbox Code Playgroud)

注意该句中的正数:FLT_MIN指的是大于零的最小(标准化)数.(有非常小的非标准化数字).

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

  • 我已经更新了答案 - 你绝对正确的不是零.我会更新问题,以反映当你执行printf时它看起来像是零,而不是它实际上是零. (2认同)
  • 注释中的文本"最小标准化正浮点数b**(emin - 1)"直接出自C标准,并且对任何C实现都有效(参见ISO/IEC 9899:TC2 5.2. 4.2.2/11). (2认同)
  • @Nick:如果使用指数表示法,它看起来不像零. (2认同)
  • `FLT_MIN`指的是最小**标准化**正浮点数.最小正浮点数是非规范化数,即2 ^( - 149)≈1.4013e-45. (2认同)

Jon*_*ler 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
Run Code Online (Sandbox Code Playgroud)