2012-02-07 48 views
4

爲了防止DivideByZeroException在C#中,人們經常寫東西像x!= 0.0是否對DivideByZeroException進行安全檢查?

double f(double x) { 
    if (x != 0.0) return 1000.0/x; 
    else return 0.0; 
} 

鑑於浮點運算總是有不精確的,我不知道它是否保證該功能不會拋出一個DivideByZeroException。

+1

爲什麼不抓住DivideByZeroException並在catch中返回0.0? – 2012-02-07 11:50:22

+0

嗯,不,故意產生垃圾計算結果是非常不明智的。你會想* throw *一個DBZE,測試double.IsInfinity的結果。 – 2012-02-07 11:59:55

回答

1

documentation說:

被零除浮點值將導致在任一正無窮大,負無窮大,或根據IEEE 754算法的規則不-一個數字(NaN)。 浮點運算不會拋出異常。有關更多信息,請參見單和雙。

所以是的,「這是保證此函數不會拋出DivideByZeroException。」 - 即使沒有進行任何檢查,即使您檢查了0.0,它可能會返回正無限,負無窮或非數字(NaN),例如,當您將相當大的值除以非常小的值時,超出雙倍範圍。

8

無論如何它不會拋出一個DivideByZeroException,因爲你正在處理double算術 - 它只會返回無窮大。其他值可能會返回無窮大,例如f(double.Epsilon)

+0

難道它不會返回double.NaN? – Dervall 2012-02-07 11:53:02

+0

@Dervall - 不,http://kossovsky.net/index.php/2010/04/division-by-zero-is-simple-but-the-result-not/ – 2012-02-07 11:54:19

+0

NaN會被0潛水0 – 2012-02-07 11:54:29