浮點數的運算原理 IEEE 754

2021-08-27 15:16:33 字數 3098 閱讀 6999

ieee二進位制浮點數算術標準(ieee 754)是20世紀80年代以來最廣泛使用的浮點數運算標準,為許多cpu與浮點運算器所採用。ieee 754規定了四種表示浮點數值的方式:單精確度(32位)、雙精確度(64位)、延伸單精確度(43位元以上,很少使用)與延伸雙精確度(79位元以上,通常以80位元實做)。

ieee 754將儲存浮點數的位元序列分為三個部分:符號位s,指數字e和尾數字m。根據規定,對於32位的浮點數,最高的1位是符號位s,接著的8位是指數e,剩下的23位為有效數字m;對於64位的浮點數,最高的1位是符號位s,接著的11位是指數e,剩下的52位為有效數字m。與浮點數對應數學值計算方法為:v=(-1)^s*m*2^e.

為了便於比較兩個浮點數的大小,指數部分採用無符號整數來儲存,但是為了解決指數為負數的情況,ieee 754規定,指數域的儲存值為實際值和指數偏移量之和,指數偏移量的計算方法為2^(e-1) - 1,其中的e為儲存指數的位元的長度。例如,如果指數域的長度為8,其儲存值為129,那麼該指數域對應的實際指數為129-(2^7-1)=2,此時,指數域的儲存值範圍為0~255,實際指數範圍為-127~128.

數字是怎樣在浮點數中儲存的哪?下面我們一步一步來演示一下:

首先,將數字採用二進位制格式的科學計數法進行表示,如123.625,轉換為二進位制科學計數法:123.625(10進製)==》1111011.101(2進製)==》1.111011101*2^6。然後,將指數6與指數偏移量127相加,並填充指數域6+127==>10000101。將1.111011101去除首部的1(任何二進位制轉換為科學計數法後,其整數部分必為1(尾數域範圍為【1-2)),因此可以在尾數域中忽略該位,以便儲存更多的資料,1.111011101===》111011101===》11101110100000000000000(填充0),將11101110100000000000000賦值到尾數域,那麼此時,數值123.625的浮點數表示為:0

10000101

11101110100000000000000。

按照相反的過程,我們可以推倒出0 10000101 1110111010000000..===》0 134 1110111010000000... ==> 0 6 1.111011101==>1.111011101*2^6==>123.625

如果浮點數的指數部分的編碼值是0,尾數為非零,那麼這個浮點數將被稱為非規約形式的浮點數。ieee 754標準規定:非規約形式的浮點數的指數偏移值比規約形式的浮點數的指數偏移值大1. 例如,最小的規約形式的單精度浮點數的指數部分編碼值為1,指數的實際值為-126;而非規約的單精度浮點數的指數域編碼值為0,對應的指數實際值也是-126而不是-127。非規約浮點數,在將其轉換為數字時,是無需在尾數域的首部新增1的,即其尾數域取值範圍為0~1,因此所有的非規約浮點數比規約浮點數更接近0。其轉換過程如下:0 00000000 11101110100000..===》0 -126 11101110100000... ==> 0 -126 0.111011101==>0.111011101*2^-126

在將數字轉換為浮點數時,往往不能完全匹配,例如,將0.1轉換為二進位制格式時其對應的位元位數遠遠超個了23位。有多種方法可以用來執行捨入作業,實際上ieee標準列出4種不同的方法:

捨入到最接近:捨入到最接近,在一樣接近的情況下偶數優先(ties to even)(這是預設的捨入方式):會將結果捨入為最接近且可以表示的值,但是當存在兩個數一樣接近的時候,則取其中的偶數(在二進位制中式以0結尾的)。

朝+∞方向捨入:會將結果朝正無限大的方向捨入。

朝-∞方向捨入: 會將結果朝負無限大的方向捨入。

朝0方向捨入: 會將結果朝0的方向捨入。

除此之外,浮點數還可以表示無窮大和非數值(nan),以單精度浮點數為例,總結如下:

類別正負號

實際指數

有偏移指數

指數域尾數域數值零

0-127

00000 0000

000 0000 0000 0000 0000 0000

0.0負零

1-127

00000 0000

000 0000 0000 0000 0000 0000

−0.010

0127

0111 1111

000 0000 0000 0000 0000 0000

1.0-110

1270111 1111

000 0000 0000 0000 0000 0000

−1.0

最小的非規約數

*-126

00000 0000

000 0000 0000 0000 0000 0001

±2−23× 2−126= ±2−149≈ ±1.4×10-45

中間大小的非規約數

*-126

00000 0000

100 0000 0000 0000 0000 0000

±2−1× 2−126= ±2−127≈ ±5.88×10-39

最大的非規約數

*-126

00000 0000

111 1111 1111 1111 1111 1111

±(1−2−23) × 2−126≈ ±1.18×10-38

最小的規約數

*-126

10000 0001

000 0000 0000 0000 0000 0000

±2−126≈ ±1.18×10-38

最大的規約數

*127

2541111 1110

111 1111 1111 1111 1111 1111

±(2−2−23) × 2127≈ ±3.4×1038

正無窮0128

2551111 1111

000 0000 0000 0000 0000 0000

+∞負無窮

1128

2551111 1111

000 0000 0000 0000 0000 0000

−∞nan

*128

2551111 1111

non zero

nan* 符號位可以為0或1.

單精度浮點數(IEEE754)

單精度浮點數佔據4個位元組,4個位元組的分配如下 a 第一位為符號位,0表示正,1表示負 b 第2 9位為階碼,採用移碼表示 c 第10 32位為尾數,採用原碼表示。1 給定32位串,如何轉換成十進位制數 假設記憶體中存在32位串 cd cc 08 41。因為intel cpu採用little en...

IEEE754浮點數精度轉換

最近在利用串列埠讀取溫度採集模組上面的資料時發現返回過來的資料是16進製制的ieee754型別,很顯然這不是我們想要看到的,因此我們必須對他進行解析 因為我用的是j a,所以首先翻了相關文件,發現還真提供的有 float.intbitstofloat hex 當然自己也可以手寫乙個,這時我們就需要了...

IEEE754標準浮點數的轉換

對於乙個十進位制的的數字,當我們需要轉化為浮點數時需要按照一定的規則,而ieee754是現在應用比較廣泛的一種標準,下面是關於該標準的一些轉化規則。浮點數表示的格式 單精度 總位數 32位 符號位 1 階碼位即指數字 8 尾數字 23 指數偏移量 127 雙精度 總位數 64位 符號位 1 階碼位即...