C#でDivideByZeroExceptionを防ぐために、人々はしばしば次のようなものを書きます
double f(double x) {
if (x != 0.0) return 1000.0/x;
else return 0.0;
}
浮動小数点演算には常に不正確さがありますが、この関数がDivideByZeroExceptionをスローしないことが保証されているかどうか疑問に思います。
C#でDivideByZeroExceptionを防ぐために、人々はしばしば次のようなものを書きます
double f(double x) {
if (x != 0.0) return 1000.0/x;
else return 0.0;
}
浮動小数点演算には常に不正確さがありますが、この関数がDivideByZeroExceptionをスローしないことが保証されているかどうか疑問に思います。
算術DivideByZeroException
を扱っているので、とにかくそれはスローされません-それはただ無限大を返すでしょう。double
他の値は無限大を返す場合がありますf(double.Epsilon)
。
ドキュメントには次のように書かれています。
浮動小数点値をゼロで除算すると、IEEE 754演算の規則に従って、正の無限大、負の無限大、またはNot-a-Number(NaN)のいずれかになります。浮動小数点演算が例外をスローすることはありません。詳細については、シングルおよびダブルを参照してください。
そうです、「この関数がDivideByZeroExceptionをスローしないことが保証されています。」-チェックしなくても、正の無限大、負の無限大、またはNot-a-Number(NaN)を返す場合があります。0.0
たとえば、かなり大きな値を非常に小さな値で割って結果がを超える場合などです。ダブルでカバーされる範囲。