繁体   English   中英

查找 PI 具有特定值的术语

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM