c語言有效數字
⑴ c語言 有效位數怎麼數
有效位是整體的長度算上小數點後面。
有效數字是指的是小數點後面的數字
所以float單精度浮點型的有效數字是7位(算上小數位)
double
雙精度浮點型16位也是算上小數位。
⑵ C語言中的有效數字怎麼定義的例如123.456的有效數字是從1開始還是從4開始小數點也算有效數
C語言中的有效位數不是平時我們說的小數點後面的有效數字,而是指所有的數字,比如:123.456是從1開始的。如果數據類型是float型,那麼有效位數是7位,也就是說存儲float b=123.4567891;只能保證前7位是正確的,即我們取出b時它的前7位完全沒問題就是123.4567,但是後面的就不知道是什麼了。如果是double型數據,則有效位數是15位,存儲時類似於float型。
⑶ C語言怎麼保留六位有效數字
IEEE浮點表示
IEEE浮點標准用
.png
的形式近似表示一個數。並且將浮點數的位表示劃分為三個欄位:
符號(sign)s決定這個數是負數(s=1)還是正數(s=0)。可以用一個單獨的符號s直接編碼符號s。
尾數(signficand)M是一個二進制小數,它的范圍是1~2-ξ或者是0~1-ξ。
n位小數欄位.png編碼尾數M。
階碼(exponent)E的作用是對浮點數加權,這個權重是2的E次冪(可能是負數)。k位的階碼欄位 .png編碼階碼E。
在單精度浮點格式(c語言的float)中,s,exp和frac欄位分別為1位,8位和23位,而雙精度浮點格式(c語言中的double)中,s,exp和frac欄位分別為1位,11位和52位。
一個浮點數的常見比特位表示如下:
單精度
雙精度
而根據exp的值,被編碼的值可以分為三大類不同的情況。下面進行一一解釋。
情況1:規格化的值
即最普遍的情況,當exp,即階碼域既不為全0,也不為全1的情況。在這種情況下,階碼欄位解釋為以偏置(biased)形式表示有符號整數,即E=exp-Bias,exp是無符號數(1~254)。Bias是一個等於.png的偏置值,對於單精度來說,k=23,Bias=127,因此E的范圍是-126~+127。
frac被描述為小數值,且0≤frac<1,其二進製表示為0.frac。尾數定義為 M=1+frac ,則M=1.frac。那麼就有1≤M<2,由於總是能夠調整階碼E,使得M在范圍1≤M<2,所以不需要顯示的表示它,這樣還能獲得一個額外的精度位。也就是說,在計算機內部保存M時,默認這個數的第一位總是1,因此可以被捨去,只保存後面的frac部分,等到讀取的時候,再把第一位的1加上去。
情況2:非規格化的值
當exp,即階碼域為全0時,所表示的數便為非規格化的值,該情況下的階碼值E=1-Bias(注:為從非格式化值轉換到格式化值提供了一種方法)。尾數M=frac
非規格化的數有兩個作用。
表示數值0。格式化數中,我們總使得M≥1,因此就無法表示0。而階碼全0時,且尾數也全0時,就可以表示0了。
表示接近0.0的數。它所表示的值分布地接近於0.0,該屬性成為逐漸溢出。
情況3:特殊值
有兩種
階碼全為1,小數域全為0。它得到值為 +∞(s=0)或-∞(s=1),它在計算機中可以表示溢出的結果,例如兩個非常大的數相乘。
階碼全為1,小數域不全為0。它得到值為NaN(Note a Number)。它在計算機中可以表示非法的數,例如計算根號-1時的值。
有了前面了基礎,我們就可以來計算浮點數的數值范圍了。以單精度(float)為例,我們知道它的指數范圍(即E)為-126~+127,而M的范圍為1≤M<2,實際上,對於單精度,1≤M≤2-2^(-23)(注:23為frac欄位所佔的比特位)。那麼我們就可以得到單精度的最大值為:
.png
同理,我們可以得到單精度的最小值為:
.png
我們僅僅以單精度為例,用同樣的方法可以計算其他精度的浮點數數值范圍,在此不再贅述。
浮點數的有效位
有效位也可以理解為我們常說的精度。浮點數的精度是由尾數的位數來決定的。
對於單精度(float),它的尾數為23位,而2^23=8388608,共7位,也就是說最多能有7位有效數字,但至少能保證6位,因此其有效位為6~7位。當然我們可以通過下面的內容進一步理解。以下計算結果保留10位小數。
...png
觀察a和b的結果可以發現,0.0000001和0.0000002之間的其他數是沒有辦法通過單精度浮點數來精確表示的,也就是說,只有到小數點後面7位的值才是精確的,同理,觀察b和c的結果,0.0000002到0.0000004之間的其他數也是不能通過單精度浮點數精確表示的,更不幸地是,這之間的數,甚至只能精確到第6位。
這也就有了單精度浮點數的有效位為6~7位的結論。根據相似的方法,我們同樣可以得到雙精度浮點數的有效位為15~16位的結論,這里不再贅述。
浮點數在內存中的存儲
了解了這么多,我們來看一下一個小數究竟是如何在內存中存儲的。以float f = 8.5f為例。其二進製表示為.png,可見指數實際值為3,則根據E=exp-Bias,可知exp=E+Bias=3+127=130,根據M=1+frac,可知,frac=M-1=0.0001(二進制)而.png
⑷ C語言中如何輸入確定的有效數字
printf不能控制輸出有數字。想控製得自己寫程序,如下:
char
ss[20];
sprintf(ss,
"%lf",
s);
char
*p
=
strchr(ss,
'.');
if
(p!=NULL)
{
if
(p-ss
<
11)
ss[11]=0;
}
這時候ss中就是一個合法的數字了。簡單寫的,沒考慮超過10位的整數,也沒考慮輸出結果有沒有10位。只是超過了10位就截尾。
⑸ c語言中的單精度數據的有效位數是什麼意思
c語言中的單精度數據的有效位數是7位。
c語言中的單精度浮點數的實際有效精度為24位二進制,這相當於 24*log102≈7.2 位10進制的精度。尾數用23位存儲,加上默認的小數點前的1位1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位。
(5)c語言有效數字擴展閱讀:
單精度浮點數是用來表示帶有小數部分的實數,一般用於科學計算。在計算機存儲器中佔用4個位元(32 bits)存儲空間,包括符號位1位,階碼8位,尾數23位。利用「浮點」(浮動小數點)的方法,可以表示一個范圍很大的數值。其數值范圍為-3.4E38~3.4E38。
單精度浮點數最多有7位十進制有效數字,如果某個數的有效數字位數超過7位,當把它定義為單精度變數時,超出的部分會自動四捨五入。單精度浮點數的指數用「E」或「e」表示。
⑹ C語言里float有效數字究竟是6位還是7位
float數據
機器內是2進制數,
1位符號位
8位指數位
23位「尾數」位
共32
位
2進制數。
平時講
有效數字
是6~7位
,指10進制。
通常程序輸入的數是10進制,進入機器後要化成2進制,計算完又轉十進制輸出。
10進制到2進制,2進制到10進制
轉換,有的數化不凈,有的數化得凈。
如同10進制分數化10進制小數,有的化得凈(例如
4分之1,變0.25),有的化不凈(例如
3分之1,變0.33333....)。
10進制到2進制,2進制到10進制
轉換,化得凈的效數字7位,化不凈的效數字6位,因為最後一位有舍入誤差。
例如:
float
x,y;
x=0.51;
//
化不凈
y=0.5;
//
化得凈
printf("x=%.8f
y=%.8",x,y);
//
輸出
0.50999999
0.50000000
⑺ c語言中怎麼保留一位有效數字
1、在C語言中一個數保留1位小數可以通過精度限定符來完成,精度限定符由一個點號後跟一個整數組成。如果要限定小數點後面一位的類型為0或者5,可以使用先乘取整再除的方法進行操作。
2、常式:
#include<stdio.h>
intmain(){
dobulea=1.23456;
printf("%.1f",((int)a*2)/2.0);//使用精度限定符%.1f,輸出:1.0
return0;
}
⑻ 在c語言中,有效數字和有效數位怎麼解釋
有效數字位數是小數點以後的數字位數,而電腦輸出的數字位數決定於定義變數的模式,並一般採用「四捨五入」的方法。
如
int i;
printf("Enter a value for i...\n");
scanf("%d", &i);
鍵盤輸入0.333,儲存到變數i里的數是0(約掉了)
如果改成:
double i;
那就會儲存0.333000
在輸出數值的時候可以先設定有效數值位數:
double i;
printf("Enter a value for i...\n");
scanf("%d", &i);
printf("\ni = %.4lf", i);
在輸出的時候在電腦上會輸出「i = 0.3330」
.在處理過程中不會當做有效數字位數來處理。
有效數字位數還可以通過常量來設定,在此不再贅述。
希望對你有用!
⑼ c語言 保留15位有效數字
用 double 型變數,可保留14-15位有效數字精度。float 只有7位精度。
double a=123.4567890123456;
printf("%.14e",a); // 保證輸出 15 位有效數字
⑽ C語言數據類型有效數字問題
1、long
int
的有效位是32位,double的有效位是15~16位。長整型與double型運算時要一律轉換成double的原因是:double所存的數的范圍,比long
int
要大得多。而且,因為計算機存儲方式的原因,整型和浮點型是不能直接運算的。兩個小一點的數運算,不論怎麼轉換,對結果都沒有影響,但是如果是一個比較小的數,和一個很大的數運算,當然是省略小的比較精確。
2雖然兩個數都能用float
存儲,但是他們的結果的有效數字是大於float的存儲范圍,在運算時只允許結果小於7位的有效數參加運算,也就是說,不是每位數都能參加運算。如果換成double每位數都能參加運算,雖然最後的有效位是一樣的,但是精度卻提高了。尤其當結果還是一個比較大的數時。