簡體   English   中英

為什么float.MaxValue 0xFF 0xFF 0x7F 0x7F而不是0x7F,0xFF,0xFF,0xFF就像整數?

[英]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浮點值由以下部分組成:

  • 一個符號位,正數為零
  • 8位指數,不能全是1(因為那意味着值是NaN),所以最大值是11111110 = 254(偏差)= 127(實際指數)
  • 23位尾數,其中最大值為全1

所以我希望最大單精度浮點值看起來像0x7F7FFFFF。

浮點數據格式與整數格式完全不同。 該值由三個組成部分組成,即符號,指數和有效數。 這些單獨的組件分布在數據格式的多個字節中。 例如,符號是單個位,並且與另一個組件存儲在相同的字節中。

底線是您對整數表示的了解不適用於浮點表示。

浮點數和浮點數通常與整數略有不同。 雖然整數只是一個整數值的兩個補碼表示,浮點數由不同的部分組成:符號位(S),指數字段(E)和有效數字或尾數(M),從左到右

最大可用指數為0xFE,因為0xFF是表示無窮大的特殊值。

所以我們有一個符號位,對於正數為0,最大指數為0xFE,尾數為1,導致

SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

01111111 01111111 11111111 111111117F 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.

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