#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 .