單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。
因為 10^7
雙精度的尾數用52位儲存,2^(52+1) = 9007199254740992,
因為10^16
擴充套件資料:
“浮點數的精度取決於尾數部分。尾數部分的位數越多,能夠表示的有效數字越多。”這句贊同,所以雙精度的有效位數肯定比單精度的多。
一個數如果有效位數大於7位 如1.27893456076(12位),用float來表示就不能準確的儲存了。
執行:
float a = 1.23456789076f;// --->a = 1.2345679
即用1.23456789076在計算機中儲存成float的格式只能逼近到第七位,
能不能準確儲存還取決於這個數字(十進位制數)能不能用有限的二進位制位數準確的表示。 float = 2.202 float = 2.25
如果小數部分轉化為二進位制時候得到一個無窮值,則會根據尾數部門的長度捨棄多餘的部分,從而儲存一個近似的浮點值,這就解釋了 為什麼在比較浮點數值時候 要做一個區間比較 而不是 等值比較。
溢位處理
浮點數的溢位是以其階碼溢位表現出來的。在加\減運算過程中要檢查是否產生了溢位:若階碼正常,加(減)運算正常結束;若階碼溢位,則要進行相應處理。另外對尾數的溢位也需要處理。
階碼上溢 超過了階碼可能表示的最大值的正指數值,一般將其認為是+∞和-∞。
階碼下溢 超過了階碼可能表示的最小值的負指數值,一般將其認為是0。
尾數上溢 兩個同符號尾數相加產生了最高位向上的進位,將尾數右移,階碼增1來重新對齊。
尾數下溢 在將尾數右移時,尾數的最低有效位從尾數域右端流出,要進行舍入處理。
參考資料:
單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。
因為 10^7
雙精度的尾數用52位儲存,2^(52+1) = 9007199254740992,
因為10^16
擴充套件資料:
“浮點數的精度取決於尾數部分。尾數部分的位數越多,能夠表示的有效數字越多。”這句贊同,所以雙精度的有效位數肯定比單精度的多。
一個數如果有效位數大於7位 如1.27893456076(12位),用float來表示就不能準確的儲存了。
執行:
float a = 1.23456789076f;// --->a = 1.2345679
即用1.23456789076在計算機中儲存成float的格式只能逼近到第七位,
能不能準確儲存還取決於這個數字(十進位制數)能不能用有限的二進位制位數準確的表示。 float = 2.202 float = 2.25
如果小數部分轉化為二進位制時候得到一個無窮值,則會根據尾數部門的長度捨棄多餘的部分,從而儲存一個近似的浮點值,這就解釋了 為什麼在比較浮點數值時候 要做一個區間比較 而不是 等值比較。
溢位處理
浮點數的溢位是以其階碼溢位表現出來的。在加\減運算過程中要檢查是否產生了溢位:若階碼正常,加(減)運算正常結束;若階碼溢位,則要進行相應處理。另外對尾數的溢位也需要處理。
階碼上溢 超過了階碼可能表示的最大值的正指數值,一般將其認為是+∞和-∞。
階碼下溢 超過了階碼可能表示的最小值的負指數值,一般將其認為是0。
尾數上溢 兩個同符號尾數相加產生了最高位向上的進位,將尾數右移,階碼增1來重新對齊。
尾數下溢 在將尾數右移時,尾數的最低有效位從尾數域右端流出,要進行舍入處理。
參考資料: