[英]Why is float.MaxValue 0xFF 0xFF 0x7F 0x7F and not 0x7F, 0xFF, 0xFF, 0xFF like ints?
我想這需要額外的信息。 但是,為什么會那樣?
(這假設23位浮點類型基於IEEE 754 32位二進制浮點和Little Endianness。)
在32位整數中,它非常簡單,因為:
int.MaxValue = 0x7FFFFFFF = 01111111 11111111 11111111 11111111 = 2147483647
在浮點數:
0x7FFFFFFF = 01111111 11111111 11111111 11111111 = 2.14748365E + 9
我得到了E + 9表示法。 但為什么會這樣:
float.MaxValue = 0xFFFF7F7F = 11111111 11111111 01111111 01111111 = 3.40282347E + 38
你說:
int.MaxValue = 0x7F,0xFF,0xFF,0xFF = 01111111 11111111 11111111 11111111 = 2147483647
int.MaxValue確實是2147483647,因為這是一個32位值,以二進制補碼進行簽名和編碼,在您的情況下以這種方式評估:
值= -2 31 b 31 + b 30 •2 30 + b 29 •2 29 + ... + b 0 •2 0 = 2147483647(因為所有位b 0至b 30均為1且b 31為0)。
你說:
在浮點數:0x7F,0xFF,0xFF,0xFF = 01111111 11111111 11111111 11111111 = 2.14748365E + 9
這有點不正確。 你所做的是將int.MaxValue轉換為float(你沒有將max int值的編碼解釋為float - 你已經改變了表示),這是:
2.14748365E +9≈2147483647= 2147483647.0 - 人類所有相同的東西,但浮點值和整數在內存中的編碼方式不同
但
2147483647.0的十六進制表示(舍入為浮點數時)為0x4f000000而不是0x7F,0xFF,0xFF,0xFF。
這就是為什么( 單精度浮點格式 ):
0x4f000000的值為(-1) 0 •(1 + 0)•2 158-127 = 1•1•2 31 = 2 31 = 2147483648.0
您可以在線查看IEE754轉換器 。
你還說:
float.MaxValue = 0xFF 0xFF 0x7F 0x7F = 11111111 11111111 01111111 01111111 = 3.40282347E + 38
3.40282347E + 38值是正確的,但其十六進制表示不是0xFF 0xFF 0x7F 0x7F而是0x7f7fffff。
您可以這樣解碼0x7f7fffff:
(-1) 0 •(1 + 2 -1 +2 -2 +2 -3 + ... + 2 -23 )•2 254-127 = 1•(1 + 1)•2 127 ,約為2•2 127 = 2 128≈3.40282347E + 38。
你可能想知道為什么指數是254而不是255.指數值255是一種特殊情況,指數設置為255的值被視為+無窮大或-infinity(取決於符號位),如果有效數(分數)字段是如果有效數字段不為零,則為零和NaN。
這假設32位浮點類型基於IEEE 754 32位二進制浮點。
最大有限浮點數在符號位和最低有效指數位中均為零。 在大端十六進制中,即0x7f7fffff。 符號位(數字的最高位)為零,使其為正。 最低有效指數位(第二個字節的最高有效位)為零以獲得有限數。 所有指數位1都是NaN或無窮大。
0xffff7f7f是little-endian表示。
看起來你的字節順序很混亂。 最大單精度(32位) IEEE-754浮點值由以下部分組成:
所以我希望最大單精度浮點值看起來像0x7F7FFFFF。
浮點數據格式與整數格式完全不同。 該值由三個組成部分組成,即符號,指數和有效數。 這些單獨的組件分布在數據格式的多個字節中。 例如,符號是單個位,並且與另一個組件存儲在相同的字節中。
底線是您對整數表示的了解不適用於浮點表示。
浮點數和浮點數通常與整數略有不同。 雖然整數只是一個整數值的兩個補碼表示,浮點數由不同的部分組成:符號位(S),指數字段(E)和有效數字或尾數(M),從左到右
最大可用指數為0xFE,因為0xFF是表示無窮大的特殊值。
所以我們有一個符號位,對於正數為0,最大指數為0xFE,尾數為1,導致
SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
01111111 01111111 11111111 11111111
或7F 7F FF FF
因為在一個小端機器中,字節的順序是相反的,你看到的是
FF FF 7F 7F
對於IEEE 754-1985規范,浮點格式為S8.24。
所以最大的歸一化數是2 ^ 127 *(2-2 ^ -23)。
當以二進制編碼時,得到0,1111 1110,111 1111 1111 1111 1111 1111
。
請在IEEE 754-1985中找到更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.