Java 查找PI具有特定值的项
我在计算无穷级数的π值时有点卡住了: π=4-4/3+4/5-4/7+4/9-4/11+… 必须解决的问题是“打印一张表,显示通过计算本系列的前200000项近似得出的π值。在首次获得以3.14159开头的值之前,需要使用多少项?” 我不确定我用来寻找这个术语的条件是否正确。有人能告诉我这是对的还是错的吗?如果不是,正确的方法是什么?我怀疑这与Java如何舍入数字有关Java 查找PI具有特定值的项,java,Java,我在计算无穷级数的π值时有点卡住了: π=4-4/3+4/5-4/7+4/9-4/11+… 必须解决的问题是“打印一张表,显示通过计算本系列的前200000项近似得出的π值。在首次获得以3.14159开头的值之前,需要使用多少项?” 我不确定我用来寻找这个术语的条件是否正确。有人能告诉我这是对的还是错的吗?如果不是,正确的方法是什么?我怀疑这与Java如何舍入数字有关 package com.company; public class Main { public static voi
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);
}
}
package.com公司;
公共班机{
公共静态void main(字符串[]args){
双结果=0;
int j=1;
int k=1;//控制用于查找术语的if部分
int term=0;//我们要查找的术语的变量
对于(inti=1;i3.14158&&result<3.14160){
术语=i;
k=0;
}
}
System.out.printf(“%f\n”,结果);
}
System.out.println(“pi值为3.14159:+期限的期限”);
}
}
Java数学
课程是你的朋友。文件如下:
我倾向于使用Math.floor(result*100000)==314159)
您可能还希望在结果中包含i
,以便您可以轻松地对照表格检查答案
最后,我将使用布尔值而不是int
进行测试。要检查数字是否以3.14159开头,您需要检查大于或等于该值且小于3.14160的值:
if(结果>=3.14159&&result<3.14160){
..
}
通过这一更改,我得到了一个136121的项的值,我在别处验证了这是预期的答案
不需要对结果进行任何乘法和舍入操作,因为所需的精度范围(六位小数)远低于Javadouble
所提供的,我将@Alnitak的建议合并到代码中,为您提供一些其他想法,如何优化它,以及如何使用该语言的见解。我对它做了一些调整,使其重复一个数量级的次数,并产生一个小数点的精度。但是大多数语言使用的IEEE 754浮点数学遇到的限制是浮点数在内部的表示方式。许多数字实际上“不是数字”,例如无法表示。所以有四舍五入。我相信美国宇航局有办法解决这个问题:-)我不是数学家,但可能有论文讨论了实现更高精度的技术,超出了你的问题范围
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);
}
}
公共类主{
私有最终静态int MAX_循环=2000000;
私有静态int i=1;
公共静态void main(字符串[]args){
双j=1.0,结果=0.0;
对于(;i=3.141592&&result<3.141593)
打破
系统输出打印项次(结果);
}
如果(i
欢迎来到StackOverflow。首先,请允许我恭维您提出了一个非常清晰和集中的问题,并发布了格式整洁的代码,以告知可能会出现的任何答案。我怀疑这与浮点数的内部存储方式有关,但我将对此进行研究。顺便说一句:你知道C吗?如果知道的话,你有没有尝试过将它尽可能直接移植到C语言,看看是否得到类似的结果?@clearlight它与浮点存储无关-只是OP尝试的范围测试不正确。@clearlight谢谢。我不知道C,但正如Alnitak所说,范围不正确。谢谢你们两位的回答:)Math.floor(result*100000)==3.14159
永远不可能是真的。噢!现在修复这是过于复杂的IMHO-将OP代码中的第一个表达式从result>3.14158
简单地更改为result>=3.14159
修复了他们的问题。我明白了。谢谢你的帮助:)哇,非常感谢你的回答,我希望研究这一切对你也有好处:)。我会做一些关于数字表示的研究。我很高兴我问了这个问题,因为你的回答,我发现除了语法之外,还有很多东西需要学习,才能真正擅长编程,这让事情变得更加有趣和令人振奋。再一次谢谢你们:)是的,我喜欢传递交易技巧。没多久。谢谢你的好态度。:),我希望以后我也能传授一些技巧。不客气:)
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);
}
}