【发布时间】:2022-01-26 03:59:34
【问题描述】:
我创建了一些代码,可以根据 MathWorld 上的公式 33 生成伯努利数。这是在https://mathworld.wolfram.com/BernoulliNumber.html 给出的,应该适用于所有整数 n,但一旦达到 n=14,它就会非常迅速地偏离预期结果。我认为问题可能出在阶乘代码中,虽然我不知道。
直到 13 为止都非常准确,除了 1 之外,所有奇数都应该是 0,但超过 14 的值会给出奇怪的值。例如,当 14 应该给出大约 7/6 的值时,14 给出了一个像 0.9 这样的数字,并且说 22 给出了一个非常负数,大约为 10^-4。奇数给出奇怪的值,比如 15 给出大约 -11。
这里是所有相关代码
public static double bernoulliNumber2(int n) {
double bernoulliN = 0;
for (double k = 0D; k <= n; k++) {
bernoulliN += sum2(k,n)/(k+1);
}
return bernoulliN;
}
public static double sum2(double k, int n) {
double result = 0;
for (double v = 0D; v <= k; v++) {
result += Math.pow(-1, v) * MathUtils.nCr((int) k,(int) v) * Math.pow(v, n);
}
return result;
}
public static double nCr(int n, int r) {
return Factorial.factorial(n) / (Factorial.factorial(n - r) * Factorial.factorial(r));
}
public static double factorial(int n) {
if (n == 0) return 1;
else return (n * factorial(n-1));
}
提前谢谢你。
【问题讨论】:
-
作为旁注,您绝对可以研究阶乘结果的缓存/记忆以加速程序,因为这是重复计算的。但这不是错误,因为您得到了结果。这些计算都不应在 n=14 时溢出
double。如果您能分享更多关于每个 n 值的预期与实际结果的信息,将会很有帮助。 -
预期值在 Wolfram 文章中。
-
在您的问题中填写任何必要的信息。我怀疑 Wolfram 的文章告诉我们你实际看到的数字是什么。
-
抱歉,直到 13 为止都非常准确,除了 1 之外,所有奇数都应该是 0,但超过 14 的值会给出奇怪的值。例如,当 14 应该给出大约 7/6 的值时,14 给出了一个像 0.9 这样的数字,并且说 22 给出了一个非常负数,大约为 10^-4。奇数给出奇怪的值,例如 15 给出大约 -11。
-
我认为较大的中间值会将您在最终结果中所需的精度推到尾数之外。
标签: java for-loop math sum bernoulli-numbers