Я работаю над проектом, который выполняет множество запросов и некоторое математическое моделирование, основанное на результатах этих запросов, и, наконец, некоторую оценку (читай: «время выполнения слишком длинное для тщательного тестирования»).
Недавно я обнаружил довольно новую проблему / ошибку в моем коде;некоторые из результатов получают NaN
значения для оценки!Вот как рассчитываются оценки:
Обратите внимание, что pfound
, psig
- это double
с, которые всегда положительны или 0
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()
(пользовательская функция, которая возвращает факториал как long
) возвращает long
настолько большое, что его нельзя преобразовать в double
без потери точности или чего-то в этом роде.Я проверил Long.doubleValue()
, и, очевидно, он генерирует NaN
, если его аргумент приводит к NaN
.
Есть комментарии?Я что-то упустил здесь?