2014-03-06 41 views
4

假設我有兩個變量ab,既可以是類型爲float,也可以是兩個類型都是double,它們都包含一些值。以下斷言總是成立嗎?我的意思是,數值錯誤的存在是否會改變結論?斷言關於浮點數的關係運算符

A> B,如果且僅當一個< = B是假

一個< B是真實的,當且僅當a> = b爲假

一個> = b爲一定是真真,如果一個== b爲真,如果一個== b爲真

對於第三和f

一個< = b爲一定是真的第四,我的意思是,例如,「a == b是真的」總是給你「a> = b是真實的」?

編輯:

假定既不ab是NaN或INF中。

編輯2:

讀取IEEE 754在1985年的標準後,我發現下面。

首先,它下面說

比較是準確的,並永遠不會溢出或下溢。

我明白,當做比較時,沒有考慮數字錯誤,所以數字按原樣比較。由於加法和減法如a - b需要額外的努力來定義數值誤差是什麼,我假設上面的報價是說通過判斷a - b > 0是否爲真來做比較,如a > b而不是。如果我錯了,請告訴我。

其次,它列出了四個互斥的規範關係。

四個互斥關係是可能的:小於,等於,大於和無序。最後一種情況出現在至少一個操作數是NaN的情況下。每個NaN都會將無序與包括它自己在內的所有事物進行比較。

然後,在表4中,它定義的各種操作符,如「>」或「> =」,在根據這些4間正則關係的真值的條件。從上表中我們立即具備以下條件:當且僅當一個< b爲假

一個< = b爲真,當且僅當A> B是假的

一個> = b爲真

既是一個> = b和< = b是一定正確,如果一個== b爲真

所以我的問題斷言可以斷定爲真。但是,我無法在標準中找到對稱性是否爲真的任何內容。換句話說,從a > b我不知道b < a是否爲真。因此我也無法從b < a is false推導出a <= b is true。所以,我很想知道,除了OP斷言,以下是始終不是真的

一個< b爲真,當且僅當B> A是真的

一當且僅當b> = a爲真< = b爲真

EDIT 3:

安瑞嘉正如@Mark Ransom所提到的那樣,我讀了維基百科頁面,我目前的理解是非正規數的存在並不會改變上面的結論。換句話說,如果一些硬件聲稱它完全支持非正規數字,它還需要確保比較運算符的定義符合上述標準。

編輯4:

我剛纔讀IEEE 754的2008年修訂版,它沒有說關於對稱性什麼無論是。所以我想這是不確定的。 (所有上述討論都假定在任何操作數中都不包含NaN或Inf)。

+2

當你有'NaN's時,上面的斷言將失敗。 –

+0

我明白了,謝謝。沒有nan和inf的情況如何? – shaoyl85

+1

請參閱http://stackoverflow.com/questions/1565164也 – pmeerw

回答

2

如果這兩個數字都不是NaN或無窮大,那麼您的斷言就會成立,如果您有IEEE兼容系統的話。如果標準沒有提到它,那麼我相信這只是因爲它足夠明顯,不值得一提。特別是,如果「a<b」和「b> a」不具有相同的值(即使對於NaN和無窮大),那麼我們在瘋狂的城鎮中。

非正常應該不會影響結論,因爲如果您假設IEEE兼容性,那麼非正規支持是給定的。

我能想到的唯一風險就是在涉及x87 FPU的情況下,它是奇數的80位長雙格式。從80位長雙四捨五入至兩倍或浮動是昂貴的,因此有時省略,這會導致這樣的射擊斷言:

assert(sqrt(val) == sqrt(val)); 

它可以發射,因爲第一開方的結果()調用可能被寫入內存,因此四捨五入爲浮點或雙精度。然後將它與第二個sqrt()調用的結果進行比較,該調用可能不是四捨五入的。但是,如果sqrt()返回float或double,嚴格來說,在比較之前未能對第二個sqrt()調用的結果進行四捨五入,嚴格來說,不符合IEEE標準。

無窮大應該只是一個問題,如果兩個數都是無窮大的。