为了防止 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。
无论如何它都不会抛出 a DivideByZeroException
,因为你正在处理double
算术 - 它只会返回无穷大。其他值可能返回无穷大,例如f(double.Epsilon)
.
文档说:
根据 IEEE 754 算术规则,将浮点值除以零将导致正无穷大、负无穷大或非数 (NaN)。浮点运算从不抛出异常。有关详细信息,请参阅单和双。
所以是的,“保证这个函数永远不会抛出 DivideByZeroException。” - 即使没有任何检查,但即使您检查 ,它也可能返回正无穷大、负无穷大或非数 (NaN) 0.0
,例如,当您将一个相当大的值除以一个非常小的值时,结果超过double 覆盖的范围。