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

常規方法是定義一個誤差範圍epsilon,如果 abs(a-b)&但是這樣的話可能會造成a=b,b=c,但是a!=c的情況。

有沒有滿足同一性的比較浮點數的方法?


IEEE-754 除了NaN,比較操作是 transitive 的。即對於非 NaN 的 a, b, c:

  1. if a &< b and b &< c then a &< c
  2. if a ≤ b and b ≤ c then a ≤ c
  3. if a = b and b = c then a = c

  4. if a ≥ b and b ≥ c then a ≥ c
  5. if a &> b and b &> c then a &> c

浮點數相等不能直接用二進位比較,要考慮正負零,而IEEE754的規則是 0 = -0。

對於題目的問題,是否可以定義一種大約等於的操作,而又是 transitive 的:

  • if a ? b and b ? c then a ? c

其中一個方法是把浮點數的集合分割成固定數目的子集。例如把 52-bit mantissa 截尾來比較。但這種方法沒有太大用途,因為緊貼相鄰的浮點數可能會放在兩個集合中。如果需要用固定epsilon,顯然是不能滿足 transitivity 的。


你邏輯錯了,你再想想


你只能直接把底數和指數分離出來算了。如果你想讓不同的float相等的話,幾乎沒有什麼好的定義可以讓你解決你說的那個問題。


#define bineq(vara, varb) (assert(sizeof(a) == sizeof(b)), memcmp(vara, varb, sizeof(a)) == 0)

比較二進位位相等?


浮點數本來就是一種近似表示,用於近似計算。

所以「怎樣判斷浮點數是否相等並保證同一性」本身就是一個荒謬的問題,

給出解答,就更荒謬。


誰告訴你等於就必須要具有傳遞性了?


題主偷換概念了。

首先說, "相等"的特點是自反性, 傳遞性和對稱性。題主所說的同一性我理解為傳遞性。

你把約等號寫作"等號", 然後因為等號有傳遞性,所以約等號也有傳遞性?這是很明顯的邏輯錯誤,不用我展開吧?

至於a和c的關係,再判斷一次就行了。也就是說寫三遍。


a=b,b=c,但是a!=c

這個在題設的情景下是正常情況啊


編程6年,從來沒遇到過你這種需求。

要麼求近似相等

要麼求大於小於

要麼求a,b,c是否近似等於k(a,b,c之間無比較需求,或者無矛盾的比較需求)

你不如先說下具體需求,我懷疑你是X-Y問題。


也許「同一性」並不是重點。

http://www.boost.org/doc/libs/1_36_0/libs/test/doc/html/utf/testing-tools/floating_point_comparison.html


_controlfp_s(nCurrentState,_PC_24,_MCW_PC)


asm volatile ()

+

vcmp

or

fmov + cmp


來,題主我教你,為了保證全部一樣,把你的浮點數轉成有效數字範圍內的等長度的字元串然後再比較,這樣媽媽再也不怕你寫錯程序了,嗯,就這樣。


計算機處理的話,,難道不是a=b b=c a=c 么? 誤差範圍不就是系統所能表示的最小精度么?


推薦閱讀:

對於一個很複雜的常量表達式,編譯器會算出結果再編譯嗎?
面向對象和面向過程分別是什麼?
C C++ Python哪個更適合新手?
為什麼編程語言中,循環計數器的默認變數都是「i」?
C 語言中字元串常量的好處在哪裡?

TAG:編程 | C編程語言 | C | 二進位 | 浮點數 |