我正在做一个项目,该项目基于这些查询的结果进行大量查询和一些数学建模,最后是一些评分(阅读:“执行时间太长而无法彻底测试”)。
最近我在我的代码中发现了一个相当新的问题/错误;一些结果得到NaN
分数的值!以下是分数的计算方式:
请注意pfound
,psig
是double
始终为正或 0 的 s
Double score1 = (pfound!=0) ? (Math.log(factorial((int)psig + 1))/pfound) : 0;
score1 = score1 * alpha_coeff[0];
if (score1.isInfinite())
throw new RuntimeException(p.getName() + " score1 = Inf");
else if(score1.isNaN())
throw new RuntimeException(p.getName() + " score1 = NaN");
我已经检查了触发的可能原因NaN
,但我相信大多数情况下应该是安全的:
我已经在检查 pfound == 0 (所以没有除以零)
Math.log() 的参数不能为负值
我怀疑的是factorial()
(将阶乘返回为 a 的自定义函数long
)是否返回 along
太大以至于不能在double
不损失精度或类似情况的情况下将其转换为 a 。我检查了Long.doubleValue()
,NaN
如果它的参数导致它显然会生成NaN
.
任何意见?我在这里错过了一些基本的东西吗?