簡體   English   中英

為什么 FLT_MIN 等於零?

[英]Why is FLT_MIN equal to zero?

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等於零而不是一個非常大的負數?

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

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

每當您嘗試從標准頭文件 float.h 打印 FLT_MIN 的值時,您將得到 0.000000(如您在輸出屏幕中看到的)。 這實際上不是錯誤。 你得到這個結果是因為格式說明符 %f。 通常 %f 在小數點后打印 6 位數字,但在這種情況下,帶符號的負值非常小,您需要在小數點后打印大量數字。

我已經使用 %.54f(取決於機器)來獲得所需的結果(對於我的系統,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

我想現在你很清楚為什么你得到 0.000000 的 CHAR_MIN 以及如何使用相同的格式說明符獲得正確的結果。雖然你可以使用 %e 來獲得更好的格式化結果。

為什么FLT_MIN等於零?

它不等於零。 由於使用"%f"在小數位后打印 6 位小數,它顯示為0.000000 . .
FLT_MIN的值通常約為 1.17549435e-38。


參考

雖然這個問題已經回答了為什么,但我想我會發布FLT_TRUE_MIN, FLT_MIN, FLT_MAX確切值以及當floatbinary32時它們最近的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM