簡體   English   中英

IEEE Std 754浮點:讓t:= a - b,標准保證a == b + t嗎?

[英]IEEE Std 754 Floating-Point: let t := a - b, does the standard guarantee that a == b + t?

假設tab都是雙(IEEE Std 754)變量,並且ab兩個值都不是NaN (但可以是Inf )。 t = a - b ,我是否必須有a == b + t

絕對不。 一個明顯的例子是a=DBL_MAXb=-DBL_MAX 然后t=INFINITY ,所以b+t也是INFINITY

更令人驚訝的是,有些情況下會發生這種情況而沒有任何溢出。 基本上,它們都是ab不精確的形式。 例如,如果aDBL_EPSILON/4b-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM