判斷浮點數是否相等的問題,到底用什麼方法去判斷

時間 2021-05-31 06:12:43

1樓:Eric Qiang

絕大多數答案都是錯的。類似的問題:「C語言標準中定義的FLT_MIN和FLT_EPSION的值為何會不同,而且相差這麼大?

」如果能正確理解這個問題的答案,你就能懂得該如何比較兩個浮點值相等了。注意,我在這裡用的是浮點『值』而不是浮點『變數』。對於浮點變數,正如前面一位寫嵌入式的答主說的:

用memcmp去逐個位元比較就行了。

舉個例子,在程式中,if( fabs(1.0/3-0.333333) < 0.

000001 ) 看起來是有道理的。 但是,if( fabs(10000.0/3-3333.

33) < 0.000001 ) 顯然很不靠譜。

結論:比較兩個浮點值是否相等,高效能的辦法是查表(look-up)或者C語言的位操作。

2樓:

浮點數在人腦中可以無限表示,但目前電腦在CPU這一級別,硬體的限制決定了它只能表示有限的浮點數。

當電腦在處理浮點數時,就需要引入乙個精度的概念(詳見IEEE浮點數算術標準)。

精度表明電腦只能處理在個精度範圍內的浮點數,如果某個浮點數超出了電腦能表示的精度,那麼在電腦中只會用在這個精度範圍內並與其最接近的浮點數來表示它。

如果有兩個浮點數的精度都在電腦支援的範圍內,那麼你就可以直接相等來判斷。

如果至少有乙個浮點數的精度在電腦支援的範圍外,那麼你在判斷時就要根據自己的需求定義乙個精度,所以在Math.abs(a-b)>0.0000000001中,0.

0000000001就是精度的意思,a和b的差在這個精度之內就表示它們是相同的。

當然在現實程式設計中判斷兩個浮點數,要先判斷這兩個浮點數的精度是否在電腦支援範圍內不太現實,所以統一的做法就是兩者相減,判斷其差是否在某個自定義的精度即可。

3樓:

設定乙個閾值,比如1e-20,兩個數相減,差值小於閾值,認為這兩個浮點數相等。

詳細知識請查詢《組成原理》中有關浮點數部分。

4樓:BensonZhang

首先先說明浮點是怎樣表達的:

1/3在二進位制中如何表示? - benson zhang 的回答然後再來說明原因,

其實這是精確度的問題.

0.1在計算機裡表達的有誤差, 0.1 在計算機裡會有乙個極小的誤差.

那麼0.100000000000002341 * 10 等於 1嗎?

計算機是不會認為它們是等於的, 所以我們要以兩數相減, 然後對比乙個極小的指(Lambda), 那麼當兩個數的差小於我們的指定值(Lambda), 我們就可以認為這兩個數是等於的.

當你加多乙個0的時候, 你的lambda值又小了10倍, 那麼說明你要求的精準度提高了.

那麼可行的辦法

1 是用更多bit編,

2 是不要加那個0.你減兩個會死噢

5樓:

計算機體系結構

double 用64位編碼,規劃化尾數用52位表示53位精度。2^53大約為9*10^15,精度大約有小數點後15位。

怎樣判斷浮點數是否相等並保證同一性?

題主偷換概念了。首先說,相等 的特點是自反性,傳遞性和對稱性。題主所說的同一性我理解為傳遞性。你把約等號寫作 等號 然後因為等號有傳遞性,所以約等號也有傳遞性?這是很明顯的邏輯錯誤,不用我展開吧?至於a和c的關係,再判斷一次就行了。也就是說寫三遍。 來,題主我教你,為了保證全部一樣,把你的浮點數轉成...

C 如何判斷乙個浮點數為0

據說他姓feng 在 標頭檔案裡頭,定義了幾個變數 FLT EPSILON 1E 5 or smallerDBL EPSILON 1E 9 or smallerLDBL EPSILON 1E 9 or smaller精確的0,在浮點數的標識範圍內。不那麼精確的0,可以以上面3個變數為參照比較參照值。...

單精度浮點數中的 單 和 浮點 是什麼意思?

XRan 單,雙精度其它答案都解答,不廢話了,我想再說說浮點。數的表示分為浮點表示和定點表示 定點表示 小數點的位置是固定的,不能移動 比如,0.0050618 這個數,它就是這麼大,它的小數點是不能移動的。如果你移動了它的小數點,這個數就變了,就不再是它原來的樣子。浮點表示 小數點的位置是可以移動...