c語言的double
㈠ c語言中為什麼要用double型
如果我只是想在中間過程中保留小數的存在用於最後捨去,那我需要double的精度嗎?
如果我要進行科學計算,double精度都不夠,那問題是不是要改成「long double精度比double高,為什麼不用double」?
C語言有float和double,最主要當然是歷史原因,當年比較廣泛的是float——當年浮點運算都是作為開銷大的一種存在。
至於寫代碼的人為什麼用float而不是double,那就得問作者本身了,但最通常的原因就是用不上和慣性——既然float的代碼也是正常在跑,為什麼要換成double?
就算是現在,我認為也不該取消float——硬體上沒取消,作為接近硬體層的C/C++也就不該也不可能取消。
不取消了不意味著必須用float,但同樣這也不意味著必須用double。知道自己需求,知道float/double的區別(包括概念上的,硬體上的),才是最重要的。
「xxx更好更輕松,為什麼不去用xxx」。「更好更輕松」都是有代價的,只不過的確日常很多時候不重要罷了。
㈡ double在c語言中的意思是什麼
double是C語言的一個關鍵字,代表雙精度浮點型,佔8個位元組內存空間,其數值范圍為「1.7E-308~1.7E+308」,雙精度完全保證的有效數字是15位,16位只是部分數值有保證。
C語言中,float和double都屬於浮點數。區別在於:double所表示的范圍,整數部分范圍大於float,小數部分,精度也高於float。
舉個例子:圓周率3.1415926535 這個數字,如果用float來表示,最多隻能精確到小數點後面的6位。而double大約能精確到小數點後面的15位左右。具體精確到幾位,跟所用的編譯器有關,但是各個編輯器編譯器之間,也是相差不大的。
至於整數部分,float表示的整數部分的范圍,就已經夠大了,能表示到萬億級別,已經大到沒邊了。而double所表示的整數范圍,大到更沒邊了。實際開發中,除了個別高精領域,基本上,使用float就足夠了。
㈢ c語言中double的用法有哪些
double是一種數據類型 具有比float更高的精度 在32位機中以8個位元組儲存。用法:同int float 一樣,用於聲明變數或定義函數的返回值類型,或可用於類型強制轉換。
函數(function)的定義通常分為傳統定義和近代定義,函數的兩個定義本質是相同的,只是敘述概念的出發點不同,傳統定義是從運動變化的觀點出發,而近代定義是從集合、映射的觀點出發。
函數的近代定義是給定一個數集A,假設其中的元素為x,對A中的元素x施加對應法則f,記作f(x),得到另一數集B,假設B中的元素為y,則y與x之間的等量關系可以用y=f(x)表示,函數概念含有三個要素:定義域A、值域B和對應法則f。
函數的由來
中文數學書上使用的「函數」一詞是轉譯詞。是我國清代數學家李善蘭在翻譯《代數學》(1859年)一書時,把「function」譯成「函數」的。
中國古代「函」字與「含」字通用,都有著「包含」的意思。李善蘭給出的定義是:「凡式中含天,為天之函數。」中國古代用天、地、人、物4個字來表示4個不同的未知數或變數。這個定義的含義是:「凡是公式中含有變數x,則該式子叫做x的函數。」
㈣ C語言中double類型怎麼使用
使用printf時,它們具有相同的格式說明符,但使用scanf時,它們沒有相同的格式說明符。
為什麼是這樣?因為printf的參數被提升,而scanf的參數(作為指針)卻不被提升。
這種論點提升到底是什麼?當較小尺寸的參數(特別是char,short和float)傳遞給可變參數函數(如printf之類的函數,其參數數量不固定)時,它們將轉換為較大尺寸。Char和short轉換為int,float轉換為double。
為什麼這樣 據我所知,純粹出於歷史原因。C的設計師認為這是個好主意,因為這些轉換基本上是免費的,因為所有類型的尺寸都足夠小,可以放入單個寄存器或堆棧中的單個「單元」(將內容壓入堆棧必須與某些位元組邊界對齊,例如,堆棧上的每個項目都必須以4的倍數的地址開頭。同樣,顯然,這種轉換減少了傳遞參數時的錯誤。
因此,當您向printf傳遞float類型的參數時,實際上它會在轉換為printf之前就轉換為double類型。我們可以使用調試器證明這一點。我寫了下面的C代碼:
主要功能編譯成:
領取關於C/C++更多學習資料:
我在調用printf之前(在地址0x63b處)放了一個斷點。根據Linux x86_64調用約定,浮點參數在XMM寄存器中傳遞(CPU中特殊的小內存位置,可用於對多條數據並行執行同一條指令,但實際上可用於大多數事情) 。因此,我查看了第一個XMM寄存器xmm0,然後:
xmm0中的值之一,當解釋為雙精度值時,是1,恰好是我們傳遞給printf的值。同時,當將該寄存器中的值解釋為浮點數時,它們是這樣(巧合的是,我們得到1.875)。因此,轉換確實發生了。這就解釋了為什麼對於printf,我們在浮點數和雙精度參數中都使用%f -浮點數無論如何都會轉換為雙精度,因此printf不能分辨出兩者之間的區別。
同時,scanf的參數是指針,因此不受此轉換的限制。其原因是因為所有指針類型僅包含內存地址,並且所有內存地址都具有相同的大小(在我的64位計算機上為64位)。因此,當scanf在其格式字元串中獲得%f時,它將期望一個float *類型的指針,而當它獲得%lf時,將期望得到double *類型的指針。如果格式說明符和指針的類型不匹配,則會產生一些有趣的結果。
由於float的大小為4個位元組,而double的大小為8個位元組(至少在我的機器上),因此當我們寫入float *類型的指針所指向的位置時,我們將覆蓋4個位元組的內存。同時,如果我們寫入由雙*指向的位置,則將覆蓋8個位元組的內存。考慮以下代碼:
printf說明符上的.15標志只是使printf精確度更高。由於我們使用的是雙精度值(並且正如我剛剛說的那樣,%f也適用於printf的雙精度值),因此我們實際上可以訪問具有這種精度的數字(只要它們不是太大而不能填充即可。我實際上不是對浮點表示非常了解)
編譯並運行後,結果如下:
如您所見,如果我們忽略所有類型的fuckery,則數字應該匹配,但它們甚至不相近。這是為什麼?
好吧,我們給scanf%f說明符,所以它期望一個浮點數*。但是我們傳遞了一個雙*。現在,這些指針的實際值都只是地址-scanf不知道它們之間的區別。它進行了下去,讀取我們輸入的值,並將其存儲為float 。但是浮點數僅佔用4個位元組,因此scanf只會在我們可用的double變數的8個位元組中寫入4個位元組。在我的情況下,由於我的機器是低位位元組序的,因此似乎對應於double變數的細粒度(小有效位)數字的第4個位元組將被覆蓋。因此,當我們列印出double double back時,我們得到的數字幾乎與以前相同,但最低有效數字有所變化。
有想學習更多C/C++知識的,可以點擊下方了解更多,領取免費學習資料:
㈤ C語言中double類型變數是什麼
1 double是雙精度浮點型
2 擴展
浮點型與整型相對應,其分為單精度浮點型和雙精度浮點型,在C語言中對應的關鍵字分別是float和double
㈥ c語言中關於double
保留2位小數輸出一個浮點數,如3.14159按%.2f輸出就是3.14。
㈦ C語言中double有什麼用處
c語言中double的用法如下:double、float都是浮點型。double(雙精度型)比float(單精度型)存的數據更准確些,占的空間也更大。double精度是float的兩倍,所以需要更精確的計算常使用double。單精度浮點數在機內佔4個位元組,用32位二進制描述。雙精度浮點數在機內佔8個位元組,用64位二進制描述。浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。數符佔1位二進制,表示數的正負。指數符佔1位二進制,表示指數的正負。尾數表示浮點數有效數字,0.xxxxxxx,但不存開頭的0和點指數存指數的有效數字。指數佔多少位,尾數佔多少位,由計算機系統決定。可能是數符加尾數佔24位,指數符加指數佔8位 -- float.數符加尾數佔48位,指數符加指數佔16位 -- double.知道了這四部分的佔位,按二進制估計大小范圍,再換算為十進制,就是你想知道的數值范圍。對編程人員來說,double 和 float 的區別是double精度高,有效數字16位,float精度7位。但double消耗內存是float的兩倍,double的運算速度比float慢得多,C語言中數學函數名稱double 和 float不同,不要寫錯,能用單精度時不要用雙精度(以省內存,加快運算速度)。
㈧ C語言中的double
scan()函數中:%f對應是float類型,%lf對應的是 double類型
printf()函數中:%f即對應float類型也對應double類型
#include<stdio.h>
double fun(double x);
main()
{
double a,b;
scanf("%lf",&a);
b=fun(a);
printf("%f\n",b);
}
double fun(double x)
{
double y;
if (x<-1)
y=x*x-1;
else
if (x<=1)
y=x*x;
else
y=x*x+1;
return(y);
}
結果:
輸入:10
顯示:101
㈨ C語言double類型
double不能精確表示所有十進制的小數,盡管double能精確表示所有整數,但將某個整數進行除n再乘n的操作後double就不一定能精確表示這個整數了,可能結果是n-0.000...0x或n+0.000...0x,此時n+0.000...0x-n>0仍然成立。所以,必須設立一個閾值,當某個double型數d-(int)d>這個閾值時,才可以認為d要大於其向下取正的值。這個閾值一般應設置為小於1e-6的數。但要注意不可太小,double能表示的最大精度為小數點後16位,且精度會隨整數部分數值的增大而降低。比較任何浮點數的大小時都一定要小心。