C語言double的輸入
Ⅰ 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對應的%lf是什麼
c語言是%if對應double,%f對應float。
scanf():「%lf」用於double類型,「%f」用於float類型printf():「%f」既可用於double類型,也可用於float類型,意思是指「保留6位小數」。
%f和%lf分別是float類型和double類型用於格式化輸入輸出時對應的格式符號。
double使用注意事項:
轉換的基本規則是「按數據長度增加的方向進行轉換」,以保證精度不降低。比如int型數據和long型數據進行相加或相減運算時,系統會先將int型數據轉換成long型,然後再進行運算。這樣的話運算結果的精度就不會降低。
在運算時,程序中所有的float型數據全部都會先轉換成double型。即使只有一個float型數據,也會先轉換成double型,然後再進行運算。為什麼要這樣呢?因為CPU在運算的時候有「位元組對齊」的要求,這樣運算的速度是最快的。
Ⅲ C語言輸入使用double型時,輸出總是出錯
C語言中scanf輸入一般是不控制精度的,只有printf輸出才會控制精度
一般輸入輸出的佔位符浮點型(float)用「%f」,雙精度型(double)用「%lf」
!注意double的「%lf」中的「l」是字母「L」的小寫,不是數字「1」!
「%1f」「%2f」「%.2f」之類的在輸入中是不規范的語法,一般只在輸出中使用,表示取幾位有效數字
Ⅳ double在c語言中的意思是什麼
double在這里是指將變數i和變數s定義為雙精度實型變數。也就是說:賦給這兩個變數的值將以雙精度實型格式存儲在內存中。
注意事項
1、類型說明符和表達式都必須加括弧(單個變數可以不加括弧),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。
2、無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變數的數據長度進行的臨時性轉換,而不改變數據說明時對該變數定義的類型。
數據類型
double(雙精度浮點型)是計算機使用的一種資料型別。比起單精度浮點數(float),double(雙精度浮點數)使用 64 位(8位元組) 來儲存一個浮點數。 它可以表示十進制的15或16位有效數字,負值取值范圍為 -1.7976E+308到 -4.94065645841246544E-324,正值取值范圍為 4.94065645841246544E-324到 1.797693E+308
以上內容參考:網路-double
Ⅳ C語言輸入一個double類型數據,要求將該數保留一位小數,第二位進行四捨五入,並將結果輸出
在C語言中輸入一個double類型數據,將該數保留一位小數,第二位進行四捨五入,並將結果輸出,這是很容易實現的,因為它自帶的格式輸出函數printf就可以輕松實現這一功能的:
double x;
scanf("%lf",&x);
printf("%.2f\n",x);
Ⅵ C語言中如何 判斷輸入是否為double
你給變數定義成double類型的,然後在給它賦值的時候,用scanf("%lf",&a);
比方你定義的變數是a
那麼你輸入的就是double的
Ⅶ C語言中關於double型數據的輸入
這是一個初學者經常犯的一個錯誤,應該用%lf,因為double和float在內存分配上存在差異,所以用scanf函數進行輸入的時候要加以區別。
Ⅷ C語言 雙精度類型(double)變數的輸入問題
c語言中
單精度型和雙精度型
指兩種
類型
的
浮點數。
單精度型
即
float
型,
有效數字約10進制7位
雙精度型
即
double
型,
有效數字約10進制15位
所以能描述的數值精度不同。
c語言
數據
用
ieee
754
國際標准。float
型
用
4
位元組存放,double
型
用
8
位元組存放。
single
precision
2進制:
數符1位,指數8
位,尾數
23
位
double
precision
2進制:
數符1位,指數11
位,尾數
52
位
單精數值范圍:
±
~10的-44.85次方
到
約
10的38.53次方
雙精度數值范圍
±
~10的-323.3
次方
to
約
10的
308.3次方。
float
a=1.234567;
double
b=1.2345678901234;
-------------
10%3
整除取余數,得
1。
1
用
float
和
double
表示,精度沒有區別。
a=(float)(10%3);
b=(double)(10%3);
強制轉換
要帶
小括弧。
Ⅸ 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有什麼用處
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不同,不要寫錯,能用單精度時不要用雙精度(以省內存,加快運算速度)。