今天我花了大约2个小时追踪一个bug,如果Java在比较NaN与float时抛出异常,我会更快地找到它。希望能够在未来避免此类问题。 感谢任何帮助。
今天我花了大约2个小时追踪一个bug,如果Java在比较NaN与float时抛出异常,我会更快地找到它。希望能够在未来避免此类问题。 感谢任何帮助。
JVM指令集参考明确禁止浮点数运算的字节码引发异常,并严格规定了NaN作为操作数时应如何工作。如果有一种方法可以做到这一点,那么要么需要您在NaN上显式抛出异常,要么使用自定义编译器为您插入这些检查。
可能有一个有用的选项是编写这样一个函数:
public static float check(float value) {
if (Float.isNaN(value))
throw new ArithmeticException("NaN");
return value;
}
使用此工具,您可以编写以下代码:
float f = check(myOtherFloat / yetAnotherFloat);
在float或double中的保护是使结果变成NaN或false。如果您想检测NaN,最好预先防止值出现,例如0/0。当您进行除法运算时,请检查0是否作为除数,并在其为0时抛出异常。您可以使用帮助方法来简化此过程。
public static double div(double a, double b) {
if(b == 0) throw new IllegalArguementException();
return a / b;
}
如果我知道值只可能是0或更多,通常会添加一个偏置,例如
double d = a / (b + 1e-9);