標籤: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浮點數的三個域
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是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。
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)是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。
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 }