⑴ c語言是不是%if對應double,%f對應float
c語言是%if對應double,%f對應float。scanf():「%lf」用於double類型,「%f」用於float類型printf():「%f」既可用於double類型,也可用於float類型,意思是指「保留6位小數」。
%f和%lf分別是float類型和double類型用於格式化輸入輸出時對應的格式符號。
其中:
float,單精度浮點型,對應%f。
double,雙精度浮點型,對應%lf。
(1)c語言double類型格式符擴展閱讀
double使用注意事項
轉換的基本規則是「按數據長度增加的方向進行轉換」,以保證精度不降低。比如int型數據和long型數據進行相加或相減運算時,系統會先將int型數據轉換成long型,然後再進行運算。這樣的話運算結果的精度就不會降低。
在運算時,程序中所有的float型數據全部都會先轉換成double型。即使只有一個float型數據,也會先轉換成double型,然後再進行運算。為什麼要這樣呢?因為CPU在運算的時候有「位元組對齊」的要求,這樣運算的速度是最快的。
⑵ 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類型怎麼使用
使用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是最多多少位
雙精度實數,佔用位元組8。
有效數字15~16(因為二進制轉十進制問題)。
數值范圍-1.7*10負308次方~1.7*10的308次方。
當有效數字全部是整數時,即整數有15~16位。
C語言中,輸出double類型(雙精度實型)以及float類型(單精度實型)時,默認輸出6位小數(不足六位以 0 補齊,超過六位按四捨五入截斷)。double a = 1;printf("%lf ", a);輸出會是:1.000000
比如計算平均分,一到兩位小數就足夠了。可是有時六位又不夠,需要更多位小數,比如計算高精度平方根。這時可以用printf的格式控制。如果要輸出n位小數,那麼可以用%.nlf的格式。其中n為數字。
所在函數庫為【ctype.h】
int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否則返回0
int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或數字('0'-'9')
返回非0值,否則返回0
intisascii(int ch) 若ch是字元(ASCII碼中的0-127)返回非0值,否則返回0
intiscntrl(int ch) 若ch是作廢字元(0x7F)或普通控制字元(0x00-0x1F)
以上內容參考:網路-C語言函數
⑸ c語言中double是什麼意思
double在這里是指將變數i和變數s定義為雙精度實型變數。(也就是說:賦給這兩個變數的值將以雙精度實型格式存儲在內存中)
注意事項
1、類型說明符和表達式都必須加括弧(單個變數可以不加括弧),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。
2、無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變數的數據長度進行的臨時性轉換,而不改變數據說明時對該變數定義的類型。
(5)c語言double類型格式符擴展閱讀
賦值中的類型轉換
當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變數的類型。具體的轉換如下:
1、浮點型與整型
將浮點數(單雙精度)轉換為整數時,將舍棄浮點數的小數部分, 只保留整數部分。將整型值賦給浮點型變數,數值不變,只將形式改為浮點形式, 即小數點後帶若干個0。注意:賦值時的類型轉換實際上是強制的。
2、單、雙精度浮點型
由於C語言中的浮點值總是用雙精度表示的,所以float 型數據只是在尾部加0延長為double型數據參加運算,然後直接賦值。double型數據轉換為float型時,通過截尾數來實現,截斷前要進行四捨五入操作。
3、char型與int型
int型數值賦給char型變數時,只保留其最低8位,高位部分舍棄。
char型數值賦給int型變數時, 一些編譯程序不管其值大小都作正數處理,而另一些編譯程序在轉換時,若char型數據值大於127,就作為負數處理。
對於使用者來講,如果原來char型數據取正值,轉換後仍為正值;如果原來char型值可正可負,則轉換後也仍然保持原值, 只是數據的內部表示形式有所不同。
⑹ 在c語言中,double函數的格式字元是f還是lf,怎麼我在turbo C中運行這2個得到的結果是一樣的
是f的.
「%f」和「%lf 」格式的輸出相同,「l」符對「f」類型無影響
⑺ C語言double的用法
double是C語言中的雙精度浮點數類型,用來表示實數。
1
定義:
double
var_name;
這樣定義一個名字為var_name的double類型變數。
2
賦值:
var_name
=
100.325;
同其它類型的賦值語句一樣,對var_name賦值用=運算符,右側可以是任意表達式。
3
輸入:
scanf("%lf",
&var_name);
%lf格式符號對應double,可以用來對double類型輸入,以下輸出類似。
4
輸出:
printf("%lf",
var_name);
⑻ C語言雙精度的格式符是%le還是%lf
都可以,只是輸出形式有所不同,%lf是以普通的浮點數的方式輸出,而%le是以科學計數法的形式輸出。
例如:
int main()
{
double n;
scanf("%lf",&n);
printf("浮點數的方式%lf 科學計數法的方式%le",n,n);
return 0;
}
輸入:123.4556666
浮點數的方式123.455667 科學計數法的方式1.234557e+002
(8)c語言double類型格式符擴展閱讀:
單精度浮點數(float)與雙精度浮點數(double)的區別如下:
1,在內存中佔有的位元組數不同
單精度浮點數在機內佔4個位元組
雙精度浮點數在機內佔8個位元組
2,有效數字位數不同
單精度浮點數有效數字7位
雙精度浮點數有效數字16位
3,所能表示數的范圍不同
單精度浮點的表示範圍:-3.40E+38 ~ +3.40E+38
雙精度浮點的表示範圍:-1.79E+308 ~ +1.79E+308
4,在程序中處理速度不同
一般來說,CPU處理單精度浮點數的速度比處理雙精度浮點數快。
參考資料來源:網路-雙精度浮點數