Почему я получаю «NaN» в качестве вывода`?

#java #pi

#java #pi

Вопрос:

Я хочу вычислить Pi с помощью Java. Совместно с S. Ramanujan formel.

Вот мой код:

 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. Почему вы вычисляете значение 50 раз, но печатаете только последний результат? Какова цель a , b fakult , x y ,, и,,,?

2.Числовое переполнение: 50! = 30414093201713378043612608166064768844377641568960512000000000000, что значительно превышает максимальное значение long (9223372036854775807). Это даже не учитывает еще большее переполнение 200!

3. На случай, если вы не знали: Чтобы «вычислить» pi в Java, используйте Math.PI

4. @Andreas Потому что он хочет реализовать формулу Рамануджана для числа Пи на Java.

5. Подсказка: Чтобы выполнить это вычисление, не вызывая числового переполнения, замените double и long на BigDecimal .

Ответ №1:

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

Максимальные шаги, которые вы можете выполнить с вашим алгоритмом прямо сейчас, — это 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 .