簡體   English   中英

IEEE浮點標准是什么(+0)+( - 0)?

[英]What is (+0)+(-0) by IEEE floating point standard?

我是對的,對任何浮點數的任何算術運算都是由IEEE浮點標准明確定義的嗎? 如果是,只是為了好奇,什么是(+0)+(-0) 有沒有辦法在實踐中用C ++或其他常用的編程語言來檢查這些東西?

有符號零的IEEE 754算術規則表明+0.0 + -0.0取決於舍入模式。 在默認的舍入模式下,它將是+0.0 向-∞舍入時,它將為-0.0

你可以用C ++來檢查這個:

#include <iostream>

int main() {
    std::cout << "+0.0 + +0.0 == " << +0.0 + +0.0 << std::endl;
    std::cout << "+0.0 + -0.0 == " << +0.0 + -0.0 << std::endl;
    std::cout << "-0.0 + +0.0 == " << -0.0 + +0.0 << std::endl;
    std::cout << "-0.0 + -0.0 == " << -0.0 + -0.0 << std::endl;
    return 0;
}

輸出

+0.0 + +0.0 == 0
+0.0 + -0.0 == 0
-0.0 + +0.0 == 0
-0.0 + -0.0 == -0

我的回答涉及IEEE 754:2008 ,這是該標准的當前版本。

在IEEE 754:2008標准中:

第4.3節涉及在執行算術運算時舍入值,以便將這些位擬合到尾數中。

4.3舍入方向屬性

舍入采用被視為無限精確的數字,並且如果需要,修改它以適合目標的格式,同時在適當時發出不准確的異常,下溢或溢出(參見7)。 除非另有說明,否則每次操作都必須執行,就好像它首先產生的中間結果正確無限精度且無限范圍,然后根據本節中的一個屬性對結果進行舍入。

舍入方向屬性會影響可能不准確的所有計算操作。 不精確的數值浮點結果始終與未包含的結果具有相同的符號。

舍入方向屬性會影響精確零和的符號(參見6.3),並且還會影響閾值,超過該閾值就會發出上溢和下溢信號。


6.3節規定了使用特殊值(NaN,無窮大,+ 0,-0)執行算術時符號位的值。

6.3符號位

當具有相反符號的兩個操作數的總和(或具有相同符號的兩個操作數的差異)恰好為零時, 除了roundTowardNegative之外,在所有舍入方向屬性中該和(或差)的符號應為+0 ; 在該屬性下,精確零和(或差)的符號應為-0。

但是,即使x為零,x + x = x - ( - x)也保持與x相同的符號。

(強調我的)

換句話說,(+ 0)+( - 0)= + 0除非舍入模式roundTowardNegative ,在這種情況下它是(+0)+( - 0)= -0。




在C#的上下文中:

根據C#語言規范的 §7.7.4 (強調我的):

  • 浮點加法:

float operator +(float x, float y);

double operator +(double x, double y);

總和根據IEEE 754算法的規則計算 下表列出了非零有限值,零,無窮大和NaN的所有可能組合的結果。 在表中,x和y是非零有限值,z是x + y的結果。 如果x和y具有相同的幅度但符號相反,則z為正零 如果x + y太大而無法在目標類型中表示,則z是無窮大,其符號與x + y相同。

 +  •  x      +0     -0     +∞     -∞    NaN
•••••••••••••••••••••••••••••••••••••••••••••
y   •  z      y      y      +∞     -∞    NaN
+0  •  x      +0     +0     +∞     -∞    NaN
-0  •  x      +0     -0     +∞     -∞    NaN
+∞  •  +∞     +∞     +∞     +∞     NaN   NaN
-∞  •  -∞     -∞     -∞     NaN    -∞    NaN
NaN •  NaN    NaN    NaN    NaN    NaN   NaN

C#中的(+0)+( - 0):

換句話說,基於規范,如果兩者都為負零,則僅添加兩個零會導致負零。 因此,回答原始問題

IEEE浮點標准是什么(+0)+( - 0)?

是+0。


C#中的舍入模式:

如果有人有興趣改變C#中的舍入模式,在“ C ++ fesetround()函數的C#等價嗎? ”中, Hans Passant說:

永遠不要修改C#中的FPU控制字。 這是你能想象到的最糟糕的全局變量。 由於全局導致的標准痛苦,你的變化不會持久,並且會隨意消失。 CLR中的內部異常處理代碼在處理異常時重置它。

假設標准舍入模式(如果您不知道舍入模式是什么以及如何更改它,則使用該模式)。

如果精確結果非零但是很小以至於舍入為零,如果精確結果大於0則結果為+0,如果精確結果小於0則結果為-0。這種情況僅發生在乘法中和除法,而不是加法和減法。

有幾種情況確切結果為零。 在這種情況下,在以下情況下結果為-0:添加(-0)+( - 0)。 減去(-0) - (+0)。 乘以一個因子為零,另一個因子具有相反的符號(包括(+0)*( - 0)。將零除以非零數,包括相反符號的無窮大。在所有其他情況下,結果是+0。

這個規則的一個不幸的副作用是x + 0.0並不總是與x相同(不是當x是-0時)。 另一方面,x - 0.0總是與x相同。 此外,x * 0.0可以是+0或-0,具體取決於x。 這可以防止精確支持IEE754的編譯器進行一些優化,或者使它們更加困難。

IEEE浮點標准的答案是+0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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