[英]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 ,這是該標准的當前版本。
第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。
- 浮點加法:
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.