浮點數(float)又稱作浮點數,是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體來說,這個實數由乙個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學記數法。
浮點計算是指浮點數參與的運算,這種運算通常伴隨著因為無法精確表示而進行的近似或捨入。
乙個浮點數a由兩個數m和e來表示:a = m × be
。在任意乙個這樣的系統中,我們選擇乙個基數
b(記數系統的基)和精度
p(即使用多少位來儲存)。m(即尾數)是形如±d.ddd...ddd的p位數(每一位是乙個介於0到b-1之間的整數,包括0和b-1)。如果m的第一位是非0整數,m稱作正規化的。有一些描述使用乙個單獨的符號位(s 代表+或者-)來表示正負,這樣m必須是正的。e是指數。
這種設計可以在某個固定長度的儲存空間內表示定點數,但無法表示的更大範圍的數。
例如,乙個指數範圍為±4的4位十進位制浮點數可以用來表示43210,4.321或0.0004321,但是沒有足夠的精度來表示432.123和43212.3(必須近似為432.1和43210)。當然,實際使用的位數通常遠大於4。
此外,浮點數表示法通常還包括一些特別的數值:+∞和?6?1∞(正負無窮大)以及nan('not a number')。無窮大用於數太大而無法表示的時候,nan則指示非法操作或者無法定義的結果。
大部份計算機採用二進位制(b=2)的表示方法。位(bit)是衡量浮點數所需儲存空間的單位,通常為32位或64位,分別被叫作單精度和雙精度。有一些計算機提供更大的浮點數,例如英特爾公司的浮點運算單元intel8087協處理器(以及其被整合進x86處理器中的後代產品)提供80位長的浮點數,用於儲存浮點運算的中間結果。還有一些系統提供128位的浮點數(通常用軟體實現)。
在計算機使用的浮點數被電氣電子工程師協會(ieee)規範化為ieee 754。
ieee二進位制浮點數算術標準(ieee 754)是2023年代以來最廣泛使用的浮點數運算標準,為許多cpu與浮點運算器所採用。這個標準定義了表示浮點數的格式(包括負零-0)與反常值(denormal number)),一些特殊數值(無窮與非數值(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的浮點數專業小組於七十年代末期開始醞釀浮點數的標準。在2023年,英特爾公司就推出了單片的8087浮點數協處理器,其浮點數表示法及定義的運算具有足夠的合理性、先進性,被ieee採用作為浮點數的標準,於2023年發布。而在此前,這一標準的內容已在八十年代初期被各計算機公司廣泛採用,成了事實上的業界工業標準。
特殊值
這裡有三個特殊值需要指出:
如果 指數 是0 並且 小數部分 是0,這個數±0(和符號位相關)
如果 指數 = 2e
?6?1 1 並且 小數部分 是0,這個數是 ±無窮大(同樣和符號位相關)
如果 指數 = 2e
?6?1 1 並且 小數部分 非0,這個數表示為不是乙個數(nan)。
以上規則,總結如下:
形式指數
小數部分零0
0非規約形式0非0
規約形式
1 到 2e
?6?1 2
任意無窮
2e ?6?1 1
0nan
2e ?6?1 1非零
[編輯]
32位單精度
單精度二進位制小數,使用32個位元儲存。18
23 位長
***p
fraction
3130至23
偏正值 (實際的指數大小+127)
22至0 位編號(從右邊開始為0)
s為符號位,exp為指數字,fraction為有效數字。 指數部分即使用所謂的偏正值形式表示,偏正值為實際的指數大小與乙個固定值(32位的情況是127)的和。採用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果採用補碼表示的話,全體符號位s和exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常採用乙個無符號的正數值儲存。單精度的指數部分是?6?1126~+127加上偏移值127 ,指數值的大小從1~254(0和255是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。
單精度浮點數各種極值情況:
類別正負號
實際指數
有偏移指數
指數域尾數域數值零
0-127
00000 0000
000 0000 0000 0000 0000 0000
0.0負零
1-127
00000 0000
000 0000 0000 0000 0000 0000
?6?10.010
0127
0111 1111
000 0000 0000 0000 0000 0000
1.0-110
1270111 1111
000 0000 0000 0000 0000 0000
?6?11.0
最小的非規約數
*-127
00000 0000
000 0000 0000 0000 0000 0001
±2?6?123 × 2?6?1126 = ±2?6?1149 ≈ ±1.4×10-45
中間大小的非規約數
*-127
00000 0000
100 0000 0000 0000 0000 0000
±2?6?11 × 2?6?1126 = ±2?6?1127 ≈ ±5.88×10-39
最大的非規約數
*-127
00000 0000
111 1111 1111 1111 1111 1111
±(1?6?12?6?123) × 2?6?1126 ≈ ±1.18×10-38
最小的規約數
*-126
10000 0001
000 0000 0000 0000 0000 0000
±2?6?1126 ≈ ±1.18×10-38
最大的規約數
*127
2541111 1110
111 1111 1111 1111 1111 1111
±(2?6?12?6?123) × 2127 ≈ ±3.4×1038
正無窮0
128255
1111 1111
000 0000 0000 0000 0000 0000
+∞負無窮
1128
2551111 1111
000 0000 0000 0000 0000 0000
?6?1∞
nan*
128255
1111 1111
non zero
nan* 符號位可以為0或1 .
[編輯]
64位雙精度
雙精度二進位制小數,使用64個位元儲存。111
52 位長
***p
fraction
6362至52
偏正值 (實際的指數大小+1023)
51至0 位編號(從右邊開始為0)
s 為符號位,exp為指數字,fraction為有效數字。 指數部分即使用所謂的偏正值形式表示,偏正值為實際的指數大小與乙個固定值(64位的情況是1023)的和。採用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果採用補碼表示的話,全體符號位s和exp自身 的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常採用乙個無符號的正數值儲存。雙精度的指數部分是?6?11022~+1023加上1023 ,指數值的大小從1~2046(0(2進製全為0)和2047(2進製全為1)是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。
浮點數基本上可以按照符號位、指數域、尾數域的順序作字典比較。顯然,所有正數大於負數;正負號相同時,指數的二進位制表示法更大的其浮點數值更大。
任何有效數上的運算結果,通常都存放在較長的暫存器中,當結果被放回浮點格式時,必須將多出來的位元丟棄。 有多種方法可以用來執行捨入作業,實際上ieee標準列出4種不同的方法:
IEEE 浮點數標準
現在計算機中,浮點數一般採用 ieee 制定的國際標準,這種標準形式如下 數符s 階碼 含階符 尾數 小數點位置 按 ieee 標準,常用的浮點數有三種 符號位s 階碼 尾數 總位數 短實數 單精度 1 8 23 32 長實數 雙精度 1 11 52 64 臨時實數 擴充套件精度 1 15 64 8...
C標準庫 浮點數
浮點數格式學c 的時候就知道,浮點數採用的是類似於科學計數法的表示方式。具體的浮點數的模型是 乙個尾數 mantissa 乙個基數 base 乙個指數 exponent 和符號位表示。float 和double 的表示格式列個 型別儲存位數 偏移值符號位 s 指數字 e 尾數字 m 總位數十六進製制...
浮點數 儲存
關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...