為什麼單精度型的有效數字有的是八位啊?求大佬們解釋,謝謝

2021-03-30 15:26:38 字數 5397 閱讀 3726

1樓:gta小雞

當你不指定保留小數的位數時printf永遠保留6位小數。但這6位小數可能是不精確的,因為float只有最多7位有效數字。

2樓:死亡灬

因為你printf a=%f %f預設小數點後有6位

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

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位。

為什麼單精度實型是32位而有效位數是7位?

7樓:匿名使用者

一個單精度浮點數佔用32位。但浮點數與整數不同,其所能描述的數值範圍遠遠大於後者。因為它是採用科學記數形式來表達數值的,即[+/-]0.

******xe[+/-]yyy的形式。也就是說是零點几几幾乘上10的多少次方的形式。這樣,在32位中,1位用來作符號位,指數部分需要6個二進位制位,從而可以表達10的-31次方直到10的正32次方。

這樣只剩下25個二進位制位。2的25次方是一個8位數字的十進位制數,因此最大隻能達到7位有效數字。

在c語言中關於float型有一處不明:就是單精度的有效位數是7位,為什麼在下面的例子中這8位都是準確的呢?

8樓:匿名使用者

它是說保證7位準確,並不是說第8位就肯定不準確。

9樓:

type exponent length mantissa length

float 8 bits 23 bits

浮點數的有效位:23bits,合24位

其解析度為:1/(2^24)=0.000,000,059,604644775390625

=0.000,000,06

即浮點數可表示的最小數的單位為0.000000059604644775390625;

其他的數都由0.000000059604644775390625 * 2^x來表示的,

12345678920

12345678900

000000059604644775390625

=12345678848

12345678848=0.000000059604644775390625 * 2^x

具體計算略,原理如此

10樓:匿名使用者

因為計算機儲存浮點數時,是把數看作a*2^b這樣的形式,不是以10為底數,而是以2為底數。即將數轉換成以2為底的「科學計數法」的形式,再由這個形式反轉換成10進位制形式,但資料又有位數限制,所以有些數轉換成二進位制計數法形式後位數超出了限制的位數,那麼轉換回來時得到的數就會與原數有偏差,不同的數這個偏差是不同的,有可能在小數點後第7位,也有可能在第8位,也有可能在其他位數,但能保證第6位之前是正確的。

c語言中的單精度資料的有效位數是什麼意思?

11樓:

c語言中的單精度浮點數的實際有效精度為24位二進位制,這相當於 24*log102≈7.2 位10進位制的精度。尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。

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

12樓:物理公司的

在ieee754標準中進行了單精度浮點數(float)和雙精度數浮點數(double)的定義。float有32bit,double有64bit。它們的構成包括符號位、指數位和尾數位。

這些位的構成如下:

float---第31位(佔1bit)---第30-23位(佔8bit)----第22-0位(佔23bit)

double--第63位(佔1bit)---第62-52位(佔11bit)---第51-0位(佔52bit)

取值範圍主要看指數部分:

float的指數部分有8bit(2^8),由於是有符號型,所以得到對應的指數範圍-128~128。

double的指數部分有11bit(2^11),由於是有符號型,所以得到對應的指數範圍-1024~1024。

由於float的指數部分對應的指數範圍為-128~128,所以取值範圍為:

-2^128到2^128,約等於-3.4e38 — +3.4e38

精度(有效數字)主要看尾數位:

float的尾數位是23bit,對應7~8位十進位制數,所以有效數字有的編譯器是7位,也有的是8位

13樓:御含靈

比如pi=3.1415926

但是計算機裡面單精度可能只能表示成

3.14159242

那麼有效位數就是小數點後6位

14樓:匿名使用者

就是有效儲存範圍,超過儲存範圍會不準確或者錯誤

15樓:匿名使用者

例如#include

void main()

輸出結果 7654321152.000000,7654321152.000000

在ieee754標準中進行了單精度浮點數(float)和雙精度數浮點數(double)的定義。float有32bit,double有64bit。它們的構成包括符號位、指數位和尾數位。

這些位的構成如下:

float---第31位(佔1bit)---第30-23位(佔8bit)----第22-0位(佔23bit)

double--第63位(佔1bit)---第62-52位(佔11bit)---第51-0位(佔52bit)

取值範圍主要看指數部分:

float的指數部分有8bit(2^8),由於是有符號型,所以得到對應的指數範圍-128~128。

double的指數部分有11bit(2^11),由於是有符號型,所以得到對應的指數範圍-1024~1024。

由於float的指數部分對應的指數範圍為-128~128,所以取值範圍為:

-2^128到2^128,約等於-3.4e38 — +3.4e38

精度(有效數字)主要看尾數位:

float的尾數位是23bit,對應7~8位十進位制數,所以有效數字有的編譯器是7位,也有的是8位

為什麼雙精度有16位有效數字,單精度有7位

浮點數7位有效數字。雙精度數16位有效數字。浮點數取值範圍 負數取值範圍為 3.4028235e 38 到 1.401298e 45,正數取值範圍為 1.401298e 45 到 3.4028235e 38。雙精度數取值範圍 負值取值範圍 1.79769313486231570e 308 到 4.9...

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

單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2 23 1 16777216。因為 10 7 16777216 10 8,所以說單精度浮點數的有效位數是7位。雙精度的尾數用52位儲存,2 52 1 9007199254740992,因為10 16 9007199254740992 10 1...

雙精度小數型是什麼意思,單精度與雙精度是什麼意思,有什麼區別

雙精度型佔8 個位元組 64位 記憶體空間,其數值範圍為 1.79769313486232e308 到1.79769313486232e308。通常情況,單精度浮點數佔4位元組 32位 記憶體空間,其數值範圍為 3.4e38 3.4e 38,雙精度型佔8 個位元組 64位 記憶體空間,其數值範圍為 ...