gpt4 book ai didi

java - Java 中的数学问题;计算得出的不可思议的 NaN

转载 作者:行者123 更新时间:2023-12-02 15:58:30 25 4
gpt4 key购买 nike

我正在开发一个项目,该项目进行大量查询,并根据这些查询的结果进行一些数学建模,最后进行一些评分(阅读:“执行时间太长,无法彻底测试”)。

最近我在我的代码中发现了一个相当新的问题/错误;一些结果的得分为 NaN 值!以下是分数的计算方式:

请注意,pfoundpsig 是始终为正数或 0 的 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 的可能原因,但我相信其中大多数应该是安全的:

  1. 我已经在检查 pfound == 0(因此不会被零除)

  2. Math.log() 的参数不能为负值

我怀疑的是 factorial() (一个将阶乘返回为 long 的自定义函数)是否返回一个 long 所以大到不能在不损失精度或类似情况的情况下将其转换为 double 。我检查了 Long.doubleValue(),如果参数结果为 NaN,显然它会生成 NaN

有什么意见吗?我在这里错过了一些基本的东西吗?

最佳答案

如果你的阶乘正在做 x 的幼稚评估! = 1*2*3...,我敢打赌您要求的数字的阶乘无法适合您正在使用的引用。

两条建议:

  1. 如果是这种情况,请尝试使用 BigDecimal
  2. 使用gamma function而不是天真的实现。

阶乘(n)的递归,其中 n > 12 是一个非常糟糕、幼稚的想法。你并没有认真考虑过这样的事情,是吗?

关于java - Java 中的数学问题;计算得出的不可思议的 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com