2010-03-27 275 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