私は、多くのクエリと、これらのクエリの結果に基づく数学的モデリング、および最後にいくつかのスコアリングを行うプロジェクトに取り組んでいます (「実行時間が長すぎて完全にテストできません」)。
最近、コードにかなり新しい問題/バグがあることに気付きました。一部の結果NaN
はスコアの値を取得します! スコアの計算方法は次のとおりです。
は、常に正または 0 であるpfound
ことにpsig
注意してくださいdouble
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
)が非常に大きな aを返すかどうかで、精度などを失うことなくlong
a にキャストすることはできません。double
をチェックしたところ、引数の結果が の場合Long.doubleValue()
に生成されるようです。NaN
NaN
コメントはありますか?ここで何か基本的なことが欠けていますか?