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