[英]Finding the term at which PI has specific value
我有点难以从无穷级数计算 π 的值:
π = 4 – 4/3 + 4/5 – 4/7 + 4/9 – 4/11 + ...
必须解决的问题是“打印一张表格,显示通过计算这个系列的前 200,000 项近似得出的 π 值。在你第一次得到一个以 3.14159 开头的值之前,你必须使用多少项? ”
我不确定我用于查找该术语的条件是否正确。 有人可以告诉我这是否正确,如果不正确,这样做的正确方法是什么? 我怀疑它与 Java 如何舍入数字有关。
package com.company;
public class Main {
public static void main(String[] args) {
double result = 0;
int j = 1;
int k = 1; //controls the if part for finding the term
int term = 0; //variable for term that we're looking for
for (int i = 1; i <= 200000; i += 1) {
if ((i % 2) != 0) {
result += (double) 4 / j; //positive part
j += 2;
}
else {
result -= (double) 4 / j; //negative part
j += 2;
}
if (k != 0) {
/* Attempts to detect when result == 3.14159 */
if (result > 3.14158 && result < 3.14160) {
term = i;
k = 0;
}
}
System.out.printf("%f\n", result);
}
System.out.println("Term at which pi has value 3.14159: " + term);
}
}
Java Math
类是您的朋友。 文档在这里: https : //docs.oracle.com/javase/8/docs/api/java/lang/Math.html
我倾向于使用Math.floor(result * 100000) == 314159)
您可能还希望在结果中包含i
,以便您可以轻松地对照表格检查您的答案。
最后,我将使用boolean
而不是int
进行测试。
要检查数字是否以 3.14159开头,您需要检查大于或等于该值且小于3.14160 的值:
if (result >= 3.14159 && result < 3.14160) {
..
}
通过该更改,我得到了 136121 term
的值,我在其他地方验证过这是预期的答案。
不需要对结果进行任何乘法和舍入运算,因为所需的精度范围(六位十进制数字)远小于 Java double
提供的范围。
我将@Alnitak 的建议合并到代码中,为您提供一些其他想法,您可以如何优化它以及如何使用该语言的见解。 我稍微调整了一下,以多次迭代一个数量级并产生一个小数点后的精度。 但是,大多数语言使用的 IEEE 754 浮点数学会遇到的限制是浮点数在内部表示的方式。 许多数字实际上“不是数字”,例如无法表示。 所以有四舍五入。 我确信 NASA 有办法解决这个问题 :-) 我不是数学家,但可能有一些论文讨论了在您的问题范围之外实现更精确的技术。
public class Main {
private final static int MAX_LOOP = 2000000;
private static int i = 1;
public static void main(String[] args) {
double j = 1.0, result = 0.0;
for ( ; i < MAX_LOOP; i++, j += 2.0) {
if ((i % 2) != 0)
result += 4.0 / j;
else
result -= 4.0 / j;
if (result >= 3.141592 && result < 3.141593)
break;
System.out.println(result);
}
if (i < MAX_LOOP)
System.out.println("Term at which pi has value 3.141592..." + result + " = " + i);
else
System.out.println("Couldn't find pi using series with maximum iterations = " + MAX_LOOP);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.