1樓:重小樓
這個比較複雜,建議你找一下ieee754標準看一下。
這個簡單說一下吧:
在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位
2樓:star犀利
因為尾數部分是23位(0-22),而2^23是8388608,有7位,而指數跟符號只不過是有多少個0的問題,所以有效位數是7位。
為什麼雙精度有16位有效數字,單精度有7位?
3樓:娛樂小八卦啊
浮點數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。
浮點數的精度取決於尾數部分。尾數部分的位數越多,能夠表示的有效數字越多。
單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。
雙精度的尾數用52位儲存,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以雙精度的有效位數是16位。
擴充套件資料
浮點數的標準二進位制數值表示:ieee 754短浮點數和有符號整型一樣,符號位是1,表示負數;符號位是0,表示正數。
指數位部分既可表示正指數又可表示負指數。因此,指數位部分通過實際指數值加上偏差值127的方法計算。例如:
實際指數值為-15,該浮點數的指數位值是112。由於偏差值的作用,實際指數值的有效範圍為-127到128。
有效位表示標準二進位制數值的分數部分。標準二進位制數值大於1小於10幷包含小數部分。小數部分很重要,因此被包含在浮點數格式中。標準值通常都大於1,因此格式中無需包含1。
4樓:匿名使用者
float和double的精度是由尾數的位數來決定的。
浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是一個隱含著的「1」,
由於它是不變的,故不能對精度造成影響。
float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,
也即float的精度為6~7位有效數字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。
5樓:匿名使用者
在計算機記憶體中浮點數表示為1.***x*2^n。其中***x為尾數,在單精度中用23位來儲存。
加上整數位1 這樣就有24位精度。而2^23次方轉化為十進數,小數點後有7位,但並不能取到所有七位數,而能達到六位最大值999999。故單精度有7位有效數字,同理雙精度可推理出16位
單精度的浮點數有效數字為什麼是七位?
6樓:假面
單精度數的尾數用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來重新對齊。
尾數下溢 在將尾數右移時,尾數的最低有效位從尾數域右端流出,要進行舍入處理。
7樓:匿名使用者
浮點數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的值會有不同,造成你看到的現象。
8樓:
10^16 < 9007199254740992 這錯了吧!!!
10^15 < 9007199254740992<10^16
雙精度的有效位數是保證15位,部分資料可以取到16位。
9樓:
一個浮點數由三部分組成:符號位s、指數部分e(階碼)以及尾數部分m: floating
s--------e-------m
1位-----8位-----23位
浮點數的精度取決於尾數部分。尾數部分的位數越多,能夠表示的有效數字越多。
單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。
C語言雙精度,單精度是怎麼計算的
實型變數分為兩類 單精度型和雙精度型,其型別說明符為float 單精度說明符,double 雙精度說明符。在turbo c中單精度型佔4個位元組 32位 記憶體空間,其數值範圍為3.4e 38 3.4e 38,只能提供七位有效數字。雙精度型佔8 個位元組 64位 記憶體空間,其數值範圍為1.7e 3...
浮點數所能表示的數值範圍和精度撒於什麼
浮點數所能表示的數值範圍和精度取決於階碼和尾數。階碼 採用指數的實際值加上固定的偏移值的辦法表示浮點數的指數,好處是可以用長度為 個位元的無符號整數來表示所有的指數取值,這使得兩個浮點數的指數大小的比較更為容易,實際上可以按照字典序比較兩個浮點表示的大小。這種移碼錶示的指數部分,中文稱作階碼。定點數...
為什麼說有的浮點數無法精確的表示
比如儲存10進位制0.1,為什麼無法保證每一臺機子對其儲存的值不一樣呢?0.10.2 0 0.2 0.4 0 0.4 0.8 0 0.8 1.6 1 0.6 1.2 1 0.2 0.4 0 0.4 0.8 0 0.8 1.6 1 0.6 1.2 1 0.2 二進位制 0.0001 1001 1001...