在C語言中為什麼不能用 判斷a和5 2222的大小

時間 2021-06-05 02:05:30

1樓:五棍薩滿

JS著名的 0.1+0.2 != 0.3就是這個原因

計算機是二進位制的,在浮點型裡面1.5,就被表達成了00000001.10000000(為了簡便暫時使用8位),3.

25就是00000011.01000000,而像是0.2,0.

3這類無論乘上幾次2都不能變成整數的小數來講,計算機只能用最接近的二進位制數來表示了,所以這裡就有精度問題了。

2樓:黃亮anthony

簡單的說,懂得可以用,不懂不要用。比如看下面這個程式

#include

int maindouble a = 5.2222, b = 5.2222;

int r0 = a == b;

printf("%d\n%f(%llx)\n%f(%llx)", r0a, *(long long*)(&ab, *(long long*)&b);

double c = 1 / 3.0, d = 5.2222 * 3.0, e = c * d, f = 5.2222;

int r1 = (e == fprintf("\n%d\n%f(%llx)\n%f(%llx)", r1e, *(long long*)(&ef, *(long long*)&f);

}執行結果是這樣:

15.222200(4014e3886594af4f)

5.222200(4014e3886594af4f)

05.222200(4014e3886594af4e)

5.222200(4014e3886594af4f)

大家數值都一樣,乙個相等,乙個不相等。

原因在於:同乙個數值,在浮點數中有多個不同的二進位制表達方式,而 == 號是比較二進位制內容一致,而不是數值一致。

比如,浮點數是有兩個不同的零,+0和-0。

通過不同的計算方式,可能計算到同乙個值不同的浮點數表達方式。

而一般所說的精度不同,是指乙個數值,因為有精度差,導致不能還原到原來的數值。但是同乙個值本身不會變,這個時候它還是可以用等號進行比較。

3樓:鹹魚王

可以去嘗試了解一下浮點數在記憶體當中儲存的形式即可明白。

精度問題就是因為小數字段是有限的,你的5.2222在記憶體中實際儲存的並不是5.2222,而可能是5.

22220001234……(隨便瞎打的),反正就是並不實際相等。當5.2222從記憶體當中被載入到浮點暫存器的時候,由於兩者的位數不同(32bit:

80bit),導致在暫存器中的精度會有所拓展,而在CPU中計算完成放回記憶體時精度又會有所下降,因此這個時候5.2222又可能變成了5.22220001233……,所以可能你printf出來的結果是一致的,但是使用==比較時結果卻是不同的。

4樓:AimerNeige

首先要說明一點,在c語言中判斷相等要使用==,=的作用是賦值。

如果你想要判斷倆個浮點數是否相等,需要判斷他們的差的絕對值是否小於某個數(如0.00001)來做,不能直接使用==

至於原理我不是很清楚就不瞎說了 。

c語言中為什麼不能用char 指向字元陣列?

心不變情依舊 char 是二級指標,表示指標的指標,就是把不連續的空間連線起來,第乙個指標指向char 而char 可以表示一階陣列。 喵NLI 因為char z不是指標,是直接存放於棧中的陣列,這種情況下r z與r z都是獲取到z這個陣列的位址而不是二級指標 charz hello char y ...

為什麼C語言中的這個myputs函式不能執行?

引數型別不對 變數型別是按右左法則來看的,從變數名往右看,看完再往左看,如此往復 char str,str右邊是,說明str是陣列,再往左看,是 說明陣列元素是指標 也就是str是個存放char指標的陣列 然後函式裡的引數比較特殊,陣列會退化成指標 所以這麼寫的str就是個char 而已,和傳進去的...

在C語言中, a N 與 a N 有什麼區別?

知了 剛好有看過這裡,嘗試著回答一下。這其實和C語言運算子優先順序有關,弄懂這一點就會比較清楚,這裡涉及兩個運算子,下標引用和間接訪問 下標引用運算子優先順序高於間接引用,所以 a N 首先是乙個陣列,而陣列的元素是指標 加上小括號之後,即在 a N 中,要先進行 運算,所以a是乙個指標,指向乙個具...