我已經創建了一些基于 MathWorld 上的公式 33 生成伯努利數的代碼。這是在https://mathworld.wolfram.com/BernoulliNumber.html上給出的,應該適用于所有整數 n 但一旦達到 n=14,它就會極快地偏離預期結果。我認為問題可能出在階乘代碼中,盡管我不知道。
直到 13 為止都非常準確,除了 1 之外,所有奇數都應該是 0,但是超過 14 的值給出了奇怪的值。例如,14 給出一個像 0.9 這樣的數字,它應該給出大約 7/6 的值,而 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));
}
先感謝您。
uj5u.com熱心網友回復:
這是一個使用BigDecimal它似乎提供更好結果的實作。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class App {
public static double bernoulliNumber2(int n) {
BigDecimal bernoulliN = new BigDecimal(0);
for (long k = 0; k <= n; k ) {
bernoulliN = bernoulliN.add(sum2(k,n));
//System.out.println("B:" bernoulliN);
}
return bernoulliN.doubleValue();
}
public static BigDecimal sum2(long k, int n) {
BigDecimal result = BigDecimal.ZERO;
for (long v = 0; v <= k; v ) {
BigDecimal vTon = BigDecimal.valueOf(v).pow(n);
result = result.add(BigDecimal.valueOf(Math.pow(-1, v)).multiply(nCr(k,v)).multiply(vTon).divide(BigDecimal.valueOf(k 1), 1000, RoundingMode.HALF_EVEN));
}
return result;
}
public static BigDecimal nCr(long n, long r) {
return factorial(n).divide(factorial(n - r)).divide(factorial(r));
}
public static BigDecimal factorial(long n) {
if (n == 0) return BigDecimal.ONE;
else return factorial(n-1).multiply(BigDecimal.valueOf(n));
}
public static void main(String[] args) {
for (int i = 0; i < 20; i ) {
System.out.println(i ": " bernoulliNumber2(i));
}
}
}
嘗試更改傳遞給除法的比例sum2并觀察對輸出的影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/395352.html
上一篇:如何計算OpencvPython中一個框是否與另一個框重疊?
下一篇:如何確定旋轉角度?
