float變量正確賦值 int為什么能是小數(shù)?
int為什么能是小數(shù)?那個(gè) 這不是真的。因?yàn)閕nt可以 t代表小數(shù)。小數(shù)可以用浮點(diǎn)數(shù)或雙精度數(shù)表示。C語(yǔ)言中,取int()會(huì)強(qiáng)制將其他數(shù)據(jù)類(lèi)型轉(zhuǎn)換成int,小數(shù)點(diǎn)后的位數(shù)不會(huì)直接四舍五入。例如:int
int為什么能是小數(shù)?
那個(gè) 這不是真的。
因?yàn)閕nt可以 t代表小數(shù)。小數(shù)可以用浮點(diǎn)數(shù)或雙精度數(shù)表示。
C語(yǔ)言中,取int()會(huì)強(qiáng)制將其他數(shù)據(jù)類(lèi)型轉(zhuǎn)換成int,小數(shù)點(diǎn)后的位數(shù)不會(huì)直接四舍五入。
例如:
int b10//將變量聲明為int類(lèi)型,并初始化賦值。
printf(%f,b * 5.0);//打印為浮點(diǎn)數(shù),強(qiáng)制10*5.0得到50.000000。
浮動(dòng)a2.1314//將變量聲明為實(shí)數(shù),并初始化賦值。
C語(yǔ)言程序開(kāi)發(fā)中,處理浮點(diǎn)數(shù)應(yīng)該注意哪些?
謝謝邀請(qǐng)我。
在C語(yǔ)言程序的開(kāi)發(fā)中,有時(shí)浮點(diǎn)運(yùn)算是不可避免的。遺憾的是,由于計(jì)算機(jī)的精度有限,C語(yǔ)言程序并不總能準(zhǔn)確地存儲(chǔ)和處理浮點(diǎn)數(shù),這也是很多C語(yǔ)言程序盡量使用整數(shù)運(yùn)算而不是浮點(diǎn)運(yùn)算的原因之一。
計(jì)算機(jī)存儲(chǔ)浮點(diǎn)數(shù)的不同于存儲(chǔ)整數(shù)的。當(dāng)談到長(zhǎng)浮點(diǎn)數(shù)時(shí),它可以 不能存放在無(wú)限的空間里,是嗎?事實(shí)上,浮點(diǎn)數(shù)在計(jì)算機(jī)中的存儲(chǔ)是有一些國(guó)際標(biāo)準(zhǔn)的。這個(gè)可以參考我之前的文章。
鑒于C語(yǔ)言程序并不總是能準(zhǔn)確表示浮點(diǎn)數(shù),我們?cè)诰帉?xiě)程序時(shí)需要牢記這一特性,否則C語(yǔ)言程序最終可能會(huì)產(chǎn)生無(wú)法理解的結(jié)果。本文將以問(wèn)答的形式探討C語(yǔ)言程序開(kāi)發(fā)中浮點(diǎn)運(yùn)算的基本注意事項(xiàng)。
float變量定義為3.1,為什么printf打印的是3.099999?情況并非總是如此。很多計(jì)算機(jī)用二進(jìn)制表示整數(shù),用二進(jìn)制表示浮點(diǎn)數(shù)。我們?nèi)祟?lèi)經(jīng)常用十進(jìn)制來(lái)表示數(shù)字。不幸的是,可以用十進(jìn)制精確表示的數(shù)字可能無(wú)法用二進(jìn)制精確表示。
例如,在十進(jìn)制系統(tǒng)中,分?jǐn)?shù)1/3 0.33333…無(wú)數(shù)個(gè)3 s和小數(shù)可以 不能準(zhǔn)確地表示這個(gè)數(shù)字。同理,0.1,也就是1/10,可以 t無(wú)法用二進(jìn)制(0.0001100110011…)精確表示,所以在這種情況下,3.1可以 t無(wú)法精確表達(dá),只能用3.0999999來(lái)近似。
使用printf()函數(shù)打印3.1,最終顯示到終端的結(jié)果主要取決于使用的計(jì)算機(jī)中二進(jìn)制/十進(jìn)制轉(zhuǎn)換的程度。事實(shí)上,有時(shí)當(dāng)我們將一個(gè)精確的十進(jìn)制浮點(diǎn)數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),然后再轉(zhuǎn)換回十進(jìn)制數(shù)時(shí),我們會(huì)發(fā)現(xiàn)這兩個(gè)數(shù)并不是 "平等 "。
為什么可以 t sqrt(144。)得到正確的結(jié)果?
小明想用C語(yǔ)言中數(shù)學(xué)庫(kù)的sqrt()函數(shù)計(jì)算144的平方根,所以寫(xiě)了下面的C語(yǔ)言代碼,請(qǐng)看:
但是小明編的這個(gè)C語(yǔ)言。說(shuō)出代碼并執(zhí)行后,發(fā)現(xiàn)程序輸出是一串雜七雜八的數(shù)字。這是怎么回事?
仔細(xì)觀察小明 s C語(yǔ)言代碼顯示,盡管他調(diào)用了數(shù)學(xué)庫(kù)中的函數(shù),但他沒(méi)有包含相應(yīng)的頭文件 "math.h ",導(dǎo)致C語(yǔ)言編譯器無(wú)法確定sqrt()函數(shù)的原型。此時(shí),編譯器不得不 "猜測(cè) "sqrt()的函數(shù)原型為:
也就是編譯器認(rèn)為sqrt()函數(shù)的返回值是整數(shù)。如果讀者讀了我之前的文章,應(yīng)該明白計(jì)算機(jī)存儲(chǔ)整數(shù)和浮點(diǎn)數(shù)的不同,所以C語(yǔ)言程序通過(guò)存儲(chǔ)浮點(diǎn)數(shù)來(lái)解釋整數(shù)時(shí)可能出現(xiàn)意外結(jié)果是很自然的。
如果C語(yǔ)言編譯器在處理函數(shù)時(shí)沒(méi)有找到它的原型,一般會(huì)把int f()作為函數(shù)的原型。
如何判斷兩個(gè)浮點(diǎn)數(shù)是否相等?計(jì)算機(jī)可以 t精確表示浮點(diǎn)數(shù),這也影響C語(yǔ)言程序判斷兩個(gè)浮點(diǎn)數(shù)是否相等。如果讀者讀過(guò)我以前的文章,應(yīng)該很清楚,運(yùn)營(yíng)商可以 t在C語(yǔ)言程序中用來(lái)判斷兩個(gè)浮點(diǎn)數(shù)是否相等。
事實(shí)上,由于C語(yǔ)言程序不能總是準(zhǔn)確地表示浮點(diǎn)數(shù),所以當(dāng)需要判斷兩個(gè)浮點(diǎn)數(shù)是否 "平等 ",通常的做法是判斷兩個(gè)數(shù)是否 "關(guān)閉 "夠了:
其中epsilon是一個(gè)非常小的整數(shù),上面的表達(dá)式使得浮點(diǎn)數(shù)A和B足夠接近,可以近似為 "平等 "。雖然ε在浮點(diǎn)數(shù)表示的范圍內(nèi)應(yīng)該足夠小,但在實(shí)際開(kāi)發(fā)中,只要能滿足精度的實(shí)際需要, "適可而止。 "所以ε也可以是程序員自己設(shè)定的一個(gè)閾值。
如何賦一些特殊值,比如NaN(不是數(shù),不是數(shù))?很多平臺(tái)都提供了方便處理浮點(diǎn)值的工具或函數(shù),比如像isnan()這樣的一些預(yù)定義的常量和函數(shù)。這些工具要么是ltmath.hgt中的標(biāo)準(zhǔn)擴(kuò)展,要么是ltieee.hgt或ltnan.hgt的非標(biāo)準(zhǔn)擴(kuò)展。
一般來(lái)說(shuō),如果一個(gè)數(shù)不等于自己,那么它一定是楠:
然而,應(yīng)該注意,C語(yǔ)言編譯器可以優(yōu)化這種比較代碼,以便符合IEEE。還要注意,即使像NaN這樣的特殊號(hào)碼在系統(tǒng)中預(yù)定義,我們也可以 不要和其他數(shù)字比較。例如,if(xNaN)是一個(gè)不合適的代碼,因?yàn)镹aN可以 不要和數(shù)字相比。
如果開(kāi)發(fā)C語(yǔ)言程序的平臺(tái)沒(méi)有像NaN那樣直接提供特殊數(shù)字,我們可以自己定義,比如:
但是,應(yīng)該明白,有些編譯器會(huì)把上面兩行C語(yǔ)言代碼當(dāng)作 "浮點(diǎn)異常 ",而此時(shí)我們將無(wú)法獲得nan和inf。
對(duì)于nAN和inf,另外需要明確的是sprintf()函數(shù)的格式輸出。在某些平臺(tái)上,它可以生成類(lèi)似于 "南 "和 "inf "。
小結(jié)本節(jié)主要介紹C語(yǔ)言程序開(kāi)發(fā)中處理浮點(diǎn)數(shù)時(shí)應(yīng)該注意的事項(xiàng)。因?yàn)橛?jì)算機(jī)可以 不要總是精確地存儲(chǔ)浮點(diǎn)數(shù),處理浮點(diǎn)數(shù)和處理整數(shù)是有區(qū)別的。如果你不 我不知道這些,它 編寫(xiě)有問(wèn)題的代碼很容易。我強(qiáng)烈推薦你在這里閱讀我以前的文章。