假設t
,a
,b
都是雙(IEEE標準754)變量,並a
這兩個值,b
沒有NaN
(但可能是Inf
)。 經過t = a - b
,我是否一定有a == b + t
?IEEE Std 754浮點:讓t:= a - b,標準是否保證a == b + t?
回答
絕對不是。一個明顯的例子是a=DBL_MAX
,b=-DBL_MAX
。那麼t=INFINITY
,所以b+t
也是INFINITY
。
更令人驚訝的是,有些情況下這種情況沒有發生溢出。基本上,它們都是a-b
不確切的形式。例如,如果是a
和DBL_EPSILON/4
是b
-1
,a-b
是1(假設缺省舍入模式),a-b+b
然後0
我提到這個第二示例的原因是,這是迫使的規範方式四捨五入到IEEE算術的特定精度。例如,如果您有一個範圍[0,1)的數字,並且想強制將它舍入到4位的精度,則可以添加並減去0x1p49
。
第二個例子很好,因爲它不會引起Inf和NaN。非常感謝。 – updogliu
您可能想澄清一下'0x1p49'常量,我最後一次查看從0到F的十六進制數字; – MSalters
@MSalters:「0x1p49」是C標準中定義的十六進制浮點數。格式爲「0x」
在執行第一個操作的過程中,位可能已經從結果的低端丟失。所以有一個問題,第二次手術是否會重現這些損失?我沒有完全想到這一點。
但是,當然,第一個操作可能溢出到+/-無窮大,使第二個比較不等。
(而且,當然,在使用==
浮點值,一般情況下是幾乎總是一個錯誤。)
僅僅通過計數論證,第二次手術不能帶回丟失的東西。如果可以的話,你會在't'中存儲比t中的位數多的信息...... –
@R - 是的。直覺地說,由於你所說的話,人們知道它不起作用,但找到例子比吸引深奧的規則更好的「證據」,無論它有多麼有效。 –
使用花車當你不能保證任何事情。如果兩個數的指數都不相同,則算術運算的結果可能無法在浮點數中完全表示。
考慮以下代碼:
float a = 0.003f;
float b = 10000000.0f;
float t = a - b;
float x = b + t;
運行在Visual Studio 2010中,你得到t==-10000000.0f
,因此x==0
。
比較浮點數時絕不應該使用相等性。取而代之的是比較兩個值之間的差異的絕對值和足夠小以滿足您的精度需求的epsilon值。
由於不同的浮點實現可能會爲同一操作返回不同的結果,因此它會變得更加怪異。
我從來不喜歡「比較差異的絕對值」的建議。有可能得到錯誤的界限([每個計算機科學家應該知道的關於浮點運算的知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)是一個很好的開始),並且應該考慮一下,在盲目轉換任意界限之前,人們想要通過比較來完成什麼。 –
使用IEEE-754浮點數時有很多東西是有保證的。這恰好不是其中之一。 –
當使用IEEE浮點數時有很多保證,有時比較平等不僅是合理的,而且是必不可少的。浮點數學絕對是棘手的,但它不是隨機的或惡意的。以下是我的博客中關於浮點平等測試的一個示例:https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-floatsso-test-them-all/ –
- 1. 'A','B'和'A或B'的T-SQL COUNT
- 2. 執行zipE ::事件t a - >事件t b - >事件t(a,b)
- 3. 高清model_func(T,A,B,C):
- 4. 作爲模板參數:if(T receive 2 param)T(a,b);否則T(a);
- 5. 測試非整數是否在範圍[a,b) - 或[a,b],(a,b),(a,b)
- 6. 輸入(a + b)** 2,輸出a * a + a * b + b * a + b * b
- 7. Python a,b = b,a + b
- 8. 從{a-b,b-c,c-a}改變爲{(a,b),(b,c),(c,a)}?
- 9. 浮點錯誤會導致'a /(double)b> = a/b'失敗嗎?
- 10. Neon指令,vsub_f32(a,b),是a-b還是b-a?
- 11. SELECT a FROM T +從T中選擇b,或者SELECT a,b FROM T? H2數據庫
- 12. 混合兩個矢量:[a a]和[b b] to [a b a b]
- 13. 爲什麼當x(t)爲空時輸出是['a','b','a']。 Python
- 14. 通過「b =(a + b) - (a = b)」進行交換是否安全?
- 15. numpy的:點(A,B)和(A * B)的.sum()
- 16. 類型參數(F:((A,B))⇒B)(隱式CMP:訂貨[B]):(A,B)
- 17. 「A類:B <C>」和「A類<T>:B <T>」之間的區別是什麼?T:C「?
- 18. 什麼是A&B代表.Aggregate((a,b)=>聲明w/a&b)
- 19. 當b不是零時,我總是有`(a/b * b)+ a%b == a`嗎?
- 20. A→B,B→A類協會
- 21. (A && B)與(A和B)
- 22. GROUP BY(A,B)和(B,A)
- 23. a,b = b,a + b和a = b,b = a + b在fibonacci中的區別是什麼[Python]
- 24. 比賽[A](B)但不是![A](B)
- 25. 準確創建在範圍[浮點值A,B)
- 26. a + = b和a = + b之間的區別是什麼,a ++和++ a?
- 27. PHP變換陣列'a','b','c'到'a/b/c','a/b','a'
- 28. (A,B)
- 29. jQuery,驗證A或B,但不是A和B
- 30. 使用IEEE浮點格式A和B的9位浮點表示法
我相信下溢的結果將會是未定義的,第二個表達式中的溢出也是如此,因此不會。如果有人可以證實,那會很好。 – chris
嗯,我想這種證實溢出對於浮點也沒有定義:'作爲 與任何其他算術溢出,如果結果沒有在所提供的空間中填入,行爲是未定義的。' – chris
在C實現符合IEEE 754,任何浮點運算都沒有UB。所有結果都嚴格定義。 –