Java 西格玛符号
Java sigma notation
我正在为学校做一个项目。项目是求解x对于公式ex,可以定义为:
这是我的代码(重要的是要注意 "x" 的值是 5 以用于调试目的):
private static double sigmaNotation(double x) {
double ans = 0;
double calc = 0;
for (int n = 0; n <= 15; n++) {
ans = calc + ans;
calc = Math.pow(x, n)/factorial(n);
System.out.println(n+": ans: "+ans+", calc: "+calc);
}
return ans;
}
private static int factorial(double x) {
int factorial = 1;
for(double i = x; i > 1; i--) {
factorial *= i;
}
return factorial;
}
输出为:
0: ans: 0.0, calc: 1.0
1: ans: 1.0, calc: 5.0
2: ans: 6.0, calc: 12.5
3: ans: 18.5, calc: 20.833333333333332
4: ans: 39.33333333333333, calc: 26.041666666666668
5: ans: 65.375, calc: 26.041666666666668
6: ans: 91.41666666666667, calc: 21.70138888888889
7: ans: 113.11805555555556, calc: 15.500992063492063
8: ans: 128.61904761904762, calc: 9.68812003968254
9: ans: 138.30716765873015, calc: 5.3822889109347445
10: ans: 143.68945656966488, calc: 2.6911444554673722
11: ans: 146.38060102513225, calc: 1.2232474797578965
12: ans: 147.60384850489015, calc: 0.5096864498991235
13: ans: 148.1135349547893, calc: 0.568434188872778
14: ans: 148.68196914366206, calc: 2.8421709443638896
15: ans: 151.52414008802594, calc: 14.210854721819448
但它应该是这样的:
11: ans: ..., calc: 1.2232474797578965
12: ans: ..., calc: 0.5096864498991235
13: ans: ..., calc: 0.19603324996120136
14: ans: ..., calc: 0.07001187498614334
15: ans: ..., calc: 0.02333729166204778
我的代码从迭代 0 到 12 生成了完全正确的数字。在第 13 次迭代中发生了什么导致它突然生成一个奇怪的数字?
在第 13 次迭代时出现溢出。
13! = 6227020800 > 2^31 这是 Java 中最大的有效 int
值。
要解决此问题,您可以使用 long
甚至 BigInteger
和 BigDecimal
.
此外,观察计算 x^n/n!等同于 (x^(n-1)/(n-1)!) * (x/n)。这提供了一种根本不会溢出的迭代方法。
我正在为学校做一个项目。项目是求解x对于公式ex,可以定义为:
这是我的代码(重要的是要注意 "x" 的值是 5 以用于调试目的):
private static double sigmaNotation(double x) {
double ans = 0;
double calc = 0;
for (int n = 0; n <= 15; n++) {
ans = calc + ans;
calc = Math.pow(x, n)/factorial(n);
System.out.println(n+": ans: "+ans+", calc: "+calc);
}
return ans;
}
private static int factorial(double x) {
int factorial = 1;
for(double i = x; i > 1; i--) {
factorial *= i;
}
return factorial;
}
输出为:
0: ans: 0.0, calc: 1.0
1: ans: 1.0, calc: 5.0
2: ans: 6.0, calc: 12.5
3: ans: 18.5, calc: 20.833333333333332
4: ans: 39.33333333333333, calc: 26.041666666666668
5: ans: 65.375, calc: 26.041666666666668
6: ans: 91.41666666666667, calc: 21.70138888888889
7: ans: 113.11805555555556, calc: 15.500992063492063
8: ans: 128.61904761904762, calc: 9.68812003968254
9: ans: 138.30716765873015, calc: 5.3822889109347445
10: ans: 143.68945656966488, calc: 2.6911444554673722
11: ans: 146.38060102513225, calc: 1.2232474797578965
12: ans: 147.60384850489015, calc: 0.5096864498991235
13: ans: 148.1135349547893, calc: 0.568434188872778
14: ans: 148.68196914366206, calc: 2.8421709443638896
15: ans: 151.52414008802594, calc: 14.210854721819448
但它应该是这样的:
11: ans: ..., calc: 1.2232474797578965
12: ans: ..., calc: 0.5096864498991235
13: ans: ..., calc: 0.19603324996120136
14: ans: ..., calc: 0.07001187498614334
15: ans: ..., calc: 0.02333729166204778
我的代码从迭代 0 到 12 生成了完全正确的数字。在第 13 次迭代中发生了什么导致它突然生成一个奇怪的数字?
在第 13 次迭代时出现溢出。
13! = 6227020800 > 2^31 这是 Java 中最大的有效 int
值。
要解决此问题,您可以使用 long
甚至 BigInteger
和 BigDecimal
.
此外,观察计算 x^n/n!等同于 (x^(n-1)/(n-1)!) * (x/n)。这提供了一种根本不会溢出的迭代方法。