2010-03-27 278 views
22

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

float.h中,定义了FLT_MINFLT_MAX。如果你做到以下几点:

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

会得到以下的输出:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000 

FLT_MAX等于一个很大数字,如你所期望的,但为什么的FLT_MIN等于零,而不是真的大负数?

+1

我机器上的'FLT_MIN'是'1.17549435e-38F'。 – 2010-03-27 03:31:23

+2

你是如何检查价值的?在某处查找头文件?使用printf? (如果你使用的是printf,你没有使用“%f”,你是吗?你会想要“%e”得到指数表示法。) – Cascabel 2010-03-27 03:38:29

+0

我已经更新了Q和A来澄清%f printf问题。 – 2010-03-27 03:47:10

回答

49

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

+0

这似乎不是对我的答案 - 我认为你的问题是为什么它是零而不是非常小而积极的东西。 – Cascabel 2010-03-27 03:33:46

+0

有人可能会争辩说0不是严格正面的,并且该值应该是1.4e-45或者下溢前的值。 – 2010-03-27 03:36:14

+0

@Ignacio:是的,就是这一点,不是吗? – Cascabel 2010-03-27 03:37:01

11

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