A. 計算圓周率(精度保留到小數點後6位),用c語言實現,公式如下:
#include<stdio.h>
intmain()
{
doublesum=0;
inti,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum=sum+1/(double)(4*i-3)-1/(double)(4*i-1);//要轉換為浮點型的
}
printf("%.6lf ",sum*4);
return0;
}
B. 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. c語言如何精確小數點後指定位數
可以在輸出時,指定小數點後的有效位數,實現精確到若干位的效果。
要精確到小數點後若干位,則數據類型為浮點型,可能為單精度(float)或雙精度(double)。
在C語言中,使用格式化輸出函數printf來實現輸出。
輸出格式為
%.NF
1 %為格式化字元串的引導字元。
2 .N表示指定顯示N位小數。
3 F為類型字元,對於float, F值為f, 對於double,F值為lf。
舉例:
1 要輸出float a=1.23234; 保留3位小數的寫法為:
printf("%.3f",a);
2 輸出double b=123.345232; 保留4為小數,寫法為:
printf("%.4lf",b);
D. 怎麼用C語言表達兩個數的平均數保留小數點後6位
int main()
{
double x,y;
printf("Please Input to real number!");
scanf("%lf,%lf",&x,&y);
/* 加0.05把小數點後第二位四捨五入到小數點第一位*/
/*%.1lf只輸出 到小數點後第一位。*/
printf("%.1lf",((x+y)/2+0.05));
//為了看見結果加上這一句。
//while(getchar()!='q');
}
E. C語言:計算圓周率(精度保留到小數點後6位),用程序實現,公式如下:
#include<stdio.h>
#include<math.h>
int main()
{double pi=1,t=0;
for(;t<1.9999999;)
{t=sqrt(2+t);
pi*=2/t;
}
printf("%lf ",pi*2);
return 0;
}
F. c語言 float類型保留幾位啊 怎麼確定
float類型默認保留小數點後6位,若是要輸出一位或者其他位數,可以按照以下形式進行輸出:
printf("%.(這里輸入要輸出的位數)f",x);
如輸出一位:printf("%.1f",x);
實例
#include <stdio.h>
#include <float.h>
int main()
{
printf("float 存儲最大位元組數 : %lu ", sizeof(float));
printf("float 最小值: %E ", FLT_MIN );
printf("float 最大值: %E ", FLT_MAX );
printf("精度值: %d ", FLT_DIG );
return 0;
}