關於浮點型的有效數字和精度的問題

時間 2022-02-03 06:30:12

1樓:

*****你提的5個問題,給你分別簡單分析一下.

*****對於精度是6位或7位的問題,float型(4位元組32位)精度確實是6位或7位,而double型(8位元組64位)精度是15或16位. 你可以具體測試一下:

float m_float = 123.45678 ;

double m_double = 1234567890.1234567 ;

cout << "m_float = " << m_float << endl ;

cout << "m_double= " << m_double<< endl ;

結果是不是:m_float = 123.4568 ; // 有的機器估計是123.457

*****m_float = 1234567890.123457 ; /* 有的機器估計是1234567890.12346 */

*****對於「那是不是輸入更多的數字時它都只能顯示7位呢?」的說法,「顯示」一詞說得不恰當,你輸入再多的數字,在進入float或double記憶體的四個位元組後都將被截短. 你再呼叫這個float變數時它已經丟失了過量的精度,並不是什麼顯示問題.

*****其實浮點型的輸入值ifloat在存入記憶體前,由硬體做了乙個系列操作. 首先計算出唯一的n值,使得 2^n <= ifloat <= 2^(n+1). 然後用ifloat除於2^n得到乙個大於1小於2的小數decimal.

對於float型,用其中的最高位存正負號,次高8bits儲存n值,低23位存小數decimal. 低23位權值分別為:0.

5、0.25、0.125...

2^e, 其中e= -1,-2,-3...-23. 而2^(-23)決定了小數部分decimal的精度有限.

*****反過來,從記憶體讀取float,硬體也做對應的乙個系列操作. 讀取最高位表示正負號,讀取次高8位並計算出結果e然後繼續作為2的指數算出乙個整數z(2^e),小數部分按位加權得到乙個大於0小於1的數d,用小數d乘於z. 最後輸出結果.

2樓:匿名使用者

兩者位數不一樣

乙個是單精度

乙個是雙

單精度的浮點數有效數字為什麼是七位?

3樓:假面

單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。

因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。

雙精度的尾數用52位儲存,2^(52+1) = 9007199254740992,

因為10^16 < 9007199254740992 < 10^17,所以雙精度的有效位數是16位。

擴充套件資料:

「浮點數的精度取決於尾數部分。尾數部分的位數越多,能夠表示的有效數字越多。」這句贊同,所以雙精度的有效位數肯定比單精度的多。

乙個數如果有效位數大於7位 如1.27893456076(12位),用float來表示就不能準確的儲存了。

執行:float a = 1.23456789076f;// --->a = 1.2345679

即用1.23456789076在計算機中儲存成float的格式只能逼近到第七位,

能不能準確儲存還取決於這個數字(十進位制數)能不能用有限的二進位制位數準確的表示。 float = 2.202  float = 2.25

如果小數部分轉化為二進位制時候得到乙個無窮值,則會根據尾數部門的長度捨棄多餘的部分,從而儲存乙個近似的浮點值,這就解釋了 為什麼在比較浮點數值時候 要做乙個區間比較 而不是 等值比較。

溢位處理

浮點數的溢位是以其階碼溢位表現出來的。在加\減運算過程中要檢查是否產生了溢位:若階碼正常,加(減)運算正常結束;若階碼溢位,則要進行相應處理。另外對尾數的溢位也需要處理。

階碼上溢 超過了階碼可能表示的最大值的正指數值,一般將其認為是+∞和-∞。

階碼下溢 超過了階碼可能表示的最小值的負指數值,一般將其認為是0。

尾數上溢 兩個同符號尾數相加產生了最高位向上的進製,將尾數右移,階碼增1來重新對齊。

尾數下溢 在將尾數右移時,尾數的最低有效位從尾數域右端流出,要進行捨入處理。

4樓:匿名使用者

浮點數7位有效數字。

雙精度數16位有效數字。

浮點數取值範圍:

負數取值範圍為 -3.4028235e+38 到 -1.401298e-45,正數取值範圍為 1.401298e-45 到 3.4028235e+38。

雙精度數取值範圍:

負值取值範圍-1.79769313486231570e+308 到 -4.94065645841246544e-324,正值取值範圍為 4.

94065645841246544e-324 到 1.79769313486231570e+308。

c/c++中浮點數的表示遵循ieee 754標準。

乙個浮點數由三部分組成:符號位s、指數部分e(階碼)以及尾數部分m(如下)。

floating

s--------e-------m

1位-----8位-----23位

double

s--------e-------m

1位-----11位----52位

十進位制數的換算計算公式為(n^m表示n的m次冪,b表示前面的數字是二進位制):

s * 2^(e-127) * (1.m)b

浮點數的精度取決於尾數部分。尾數部分的位數越多,能夠表示的有效數字越多。

單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。

雙精度的尾數用52位儲存,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以雙精度的有效位數是16位。

另外:如果你在pi值的有效位後增加數字的話,結果是不會變化的,由於pi值是以常數方式賦值,可以在常數後面加個'f',如pi = 3.1415926f;否則編譯器會先把常數當作double型別,然後再截斷後面的值變為浮點值,這樣的話,就有可能pi的值會有不同,造成你看到的現象。

5樓:

10^16 < 9007199254740992 這錯了吧!!!

10^15 < 9007199254740992<10^16

雙精度的有效位數是保證15位,部分資料可以取到16位。

6樓:

乙個浮點數由三部分組成:符號位s、指數部分e(階碼)以及尾數部分m: floating

s--------e-------m

1位-----8位-----23位

浮點數的精度取決於尾數部分。尾數部分的位數越多,能夠表示的有效數字越多。

單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。

浮點數的精度和範圍區別是什麼,浮點數所能表示的數值範圍和精度取決於什麼

牽青芬所己 它們在記憶體中所佔的位元組不同,乙個是4位元組,乙個是8位元組,因此表示的有效位數,雙精度比單精度要大得多!上面說的是一般的c語言,如果是微控制器等,依不同的情況有所不同,如pic16微控制器有的是單精度為3位元組,雙精度為4位元組。 柏蘭雀俏 區別如下 浮點數的取值範圍由階碼的位數決定...

浮點數所能表示的數值範圍和精度撒於什麼

smile灬微光丶 浮點數所能表示的數值範圍和精度取決於階碼和尾數。階碼 採用指數的實際值加上固定的偏移值的辦法表示浮點數的指數,好處是可以用長度為 個位元的無符號整數來表示所有的指數取值,這使得兩個浮點數的指數大小的比較更為容易,實際上可以按照字典序比較兩個浮點表示的大小。這種移碼錶示的指數部分,...

幾道關於數字的題目,問幾道數學題(關於數)

1 求滿足被7除餘1,被8除餘1,被9除餘1的最小自然數。2 有乙個整數,用它去除70,98,143得到三個餘數都是29,則。這個數是多少?三個數的最小公倍數加29,14 5 7 143n 29 70070n 29 n為自然數。3 用2 3 4組成的數字不重複的所有三位數之和是多少?三位數每位的和都...