IEEE 754 浮點數在電腦中的表示方法

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   

IEEE二進位浮點數算術標準(IEEE 754)是20世紀80年代以來最廣泛使用的浮點數運算標準,為許多CPU與浮點運算器所採用。這個標準定義了表示浮點數的格式(包括負零-0)與反常值(denormal number)),一些特殊數值(無窮(Inf)與非數值(NaN)),以及這些數值的“浮點數運算子”;它也指明了四種數值舍入規則和五種例外狀況(包括例外發生的時機與處理方式)。

IEEE 754規定了四種表示浮點數值的方式:單精確度(32位)、雙精確度(64位)、延伸單精確度(43位元以上,很少使用)與延伸雙精確度(79位元以上,通常以80位元實做)。只有32位元模式有強制要求,其他都是選擇性的。大部分程式設計語言都有提供IEEE浮點數格式與算術,但有些將其列為非必需的。例如,IEEE 754問世之前就有的C語言,現在有包括IEEE算術,但不算作強制要求(C語言的float通常是指IEEE單精確度,而double是指雙精確度)。

該標準的全稱為IEEE二進位浮點數算術標準(ANSI/IEEE Std 754-1985),又稱IEC 60559:1989,微處理器系統的二進位浮點數算術(本來的編號是IEC 559:1989)[1]。後來還有“與基數無關的浮點數”的“IEEE 854-1987標準”,有規定基數為2跟10的狀況。現在最新標準是“IEEE 854-2008標準”。

在六、七十年代,各家電腦公司的各個型號的電腦,有著千差萬別的浮點數表示,卻沒有一個業界通用的標準。這給資料交換、電腦協同工作造成了極大不便。IEEE的浮點數專業小組於七十年代末期開始醞釀浮點數的標準。在1980年,英特爾公司就推出了單片的8087浮點數副處理器,其浮點數標記法及定義的運算具有足夠的合理性、先進性,被IEEE採用作為浮點數的標準,於1985年發布。而在此前,這一標準的內容已在八十年代初期被各電腦公司廣泛採用,成了事實上的業界工業標準。

 

IEEE 754浮點數的三個域

 

  • 單精確度二進位小數,使用32個位元儲存。
1 8 23 位長
S Exp Fraction
31 30至23
偏正值(實際的指數大小+127)
22至0 位編號(從右邊開始為0)

S為符號位,Exp為指數字,Fraction為有效數字。 指數部分即使用所謂的偏正值形式表示,偏正值為實際的指數大小與一個固定值(32位的情況是127)的和。採用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果採用補碼錶示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常採用一個無符號的正數值儲存。單精確度的指數部分是−126~+127加上位移值127,指數值的大小從1~254(0和255是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。

 

  • 雙精確度二進位小數,使用64個位元儲存。
1 11 52 位長
S Exp Fraction
63 62至52
偏正值(實際的指數大小+1023)
51至0 位編號(從右邊開始為0)

S為符號位,Exp為指數字,Fraction為有效數字。指數部分即使用所謂的偏正值形式表示,偏正值為實際的指數大小與一個固定值(64位的情況是1023)的和。採用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果採用補碼錶示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常採用一個無符號的正數值儲存。雙精確度的指數部分是−1022~+1023加上1023,指數值的大小從1~2046(0(2進位全為0)和2047(2進位全為1)是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。

  • 利用C語言實現IEEE浮點數二進位與十進位轉換
 1 #include "stdafx.h" 2 #include "stdio.h" 3 #include "time.h" 4 #include <iostream> 5 #include <bitset> 6  7 using namespace std; 8  9 int _tmain(int argc, _TCHAR* argv[])10 {11     float A=1.25;12     float B;13     _ULonglong nMem = *(_ULonglong *)&A;             // 擷取記憶體中儲存的A的值14     bitset<32> BitA(nMem);                          // 按照32位浮點數格式表達15     cout<<"轉換結果為二進位:"<<endl;16     cout<<BitA<<endl;17 18     B= *(float *)&BitA;             // 擷取記憶體中儲存的input的值並按浮點數格式表達19     cout<<"轉換結果為十進位:"<<endl;20     cout<<B<<endl;21 }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.