[英]IEEE Std 754 Floating-Point: let t := a - b, does the standard guarantee that a == b + t?
假設t
, a
, b
都是雙(IEEE Std 754)變量,並且a
, b
兩個值都不是NaN
(但可以是Inf
)。 在t = a - b
,我是否必須有a == b + t
?
絕對不。 一個明顯的例子是a=DBL_MAX
, b=-DBL_MAX
。 然后t=INFINITY
,所以b+t
也是INFINITY
。
更令人驚訝的是,有些情況下會發生這種情況而沒有任何溢出。 基本上,它們都是ab
不精確的形式。 例如,如果a
是DBL_EPSILON/4
且b
是-1
,則ab
是1(假設默認舍入模式),並且a-b+b
則為0。
我提到第二個例子的原因是,這是在IEEE算法中強制舍入到特定精度的規范方法。 例如,如果您的數字在[0,1]范圍內,並且想要將其舍入為4位精度,則需要先添加然后減去0x1p49
。
在執行第一個操作的過程中,位可能已從結果的低端丟失。 所以有一個問題是,第二項操作是否會完全重現這些損失? 我還沒有完全想到這一點。
但是,當然,第一次操作可能溢出到+/-無窮大,使得第二次操作不相等。
(當然,在一般情況下使用==
浮點值幾乎總是一個錯誤。)
使用花車時不保證任何東西。 如果兩個數的指數不同,則算術運算的結果可能無法在浮點數中完全表示。
考慮以下代碼:
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值進行比較,以滿足您的精度需求。
它變得更奇怪,因為不同的浮點實現可能會為同一操作返回不同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.