Почему я получаю «NaN» как Outprint`? - PullRequest
0 голосов
/ 17 марта 2019

Я хочу вычислить Pi с Java.С С. Рамануджаном Формелем.

Вот мой код:

public class PiV5 {
public static void main(String[] args) {
int a = 4;
double pi = 0;
int b = 3;
int fakult = 3;

int x = 3; 
long y = 1;
    for (int i =1; i <= 50; i++) {
        int n = i*4; 
        long fakultaet = 1;
        long fakultae2 = 1; 
        int bh = i;
        for (int g=1; g<=n; g++) {fakultaet = fakultaet * g;}
        for (int l=1; l<=bh; l++) {fakultae2 = fakultae2 * l;}

        pi = ((fakultaet * (1103 + (26390*i)))/Math.pow(fakultae2, 4) * Math.pow(396, 4*i));

    };
        System.out.println("Pi nach ein paar Rechnungen: " + (Math.sqrt(8)/9801)*pi);

    }
}

Спасибо за вашу помощь, если вы могли бы помочь мне

1 Ответ

0 голосов
/ 17 марта 2019

Как Андреас упомянул в комментариях, это вычисление приводит к переполнению чисел, потому что значения становятся большими даже для длинных типов данных.

Максимальные шаги, которые вы можете сделать с вашим алгоритмом прямо сейчас, равны 5потому что 20! = 2432902008176640000, 21! = -4249290049419214848, что вызвано переполнением чисел.

Но даже в этом случае в вашем коде есть небольшая ошибка, потому что вы забыли суммировать значения в цикле:

pi += ((fakultaet * (1103 + (26390 * i))) / Math.pow(fakultae2, 4) * Math.pow(396, 4 * i));

Для получения большей точности также используйте двойные значения для постоянных значений:

pi += ((fakultaet * (1103d + (26390d * i))) / Math.pow(fakultae2, 4) * Math.pow(396, 4 * i));

Использование этого с 5 итерациями приведет к следующему:

Pi nach ein paar Rechnungen: 4.0513767058512194E63

Этоне очень хороший результат для PI.

Чтобы улучшить его и повысить точность, вы можете использовать BigDecimal class.

...