2015-11-29 6 views
1

Я искал в Интернете алгоритм, который может вычислить значение пи эффективным образом, и я нашел это:Реализация Pi алгоритм Java

enter image description here

С помощью калькулятора, я был в состоянии вычислить первые несколько цифр pi вручную. Тогда я знал, что эта формула работает, поэтому я попытался ее реализовать. Однако выход был не где-то рядом с значением pi. Затем я попробовал напечатать значение k и выводить каждый раз, когда я увеличил k, и обнаружил, что результат шел от 3 до 10, а затем до 1 и так далее. Было бы хорошо, если бы кто-то мог указать на недостаток в моей программе.

Вот мой код:

import java.math.BigDecimal; 
import java.math.MathContext; 
import java.math.RoundingMode; 

    public class pi2 { 
static MathContext mc = new MathContext(1000, RoundingMode.HALF_EVEN); 

public static void main(String[] args) { 

    BigDecimal root2=new BigDecimal("1.41421356237309504880168872420969807856967187537694807317667973799"); 
    BigDecimal a=(root2.multiply(new BigDecimal("2"))).divide(new BigDecimal("9801"),mc); 
    BigDecimal ans=new BigDecimal("0"); 
    for(BigDecimal k=new BigDecimal("0");k.compareTo(new BigDecimal("2000"))<=0;k=k.add(new BigDecimal("1"))){ 


    BigDecimal num=fact(k.multiply(new BigDecimal("4"))); 
    num=num.multiply(new BigDecimal("1103").add(k.multiply(new BigDecimal("26390")))); 
    BigDecimal den=fact(k).pow(4); 
      den=den.multiply(new BigDecimal("396").pow(k.multiply(new BigDecimal("4")).intValueExact())); 
    ans=ans.add(num.divide(den,mc)); 



    } 
    ans=new BigDecimal("1").divide(ans,mc); 
    System.out.println(ans); 

} 
public static BigDecimal fact(BigDecimal n){ 
    BigDecimal fact=new BigDecimal("1"); 
    for(BigDecimal x=new BigDecimal("2");n.compareTo(x)>=0;x=x.add(new BigDecimal("1"))){ 
     fact=fact.multiply(x); 
    } 
    return fact; 

} 

} 

Вот результат:

5.580282058008853402510559291287581867553431390145503640210100548605034743358097050034424720628698860929750569800058429421656020670208288633526864302454613600847940382311736134643671764886381747697190968564014260705233085812484714762274969350204069098619933375627715134891912898782601108729886146330332238253003691746047262799485039571747683663565532369064391166325006674455252331737698907670644446295854092826000968263741742613071668128325081312284036131088326091218220137819968277353340599533207728105864448598414581380099885134601317006991806489649924935353370069906252625046822796244633763704419705976717286963549896200415922555506633154441005278818242772512067320640614989708237011539020994102009040721602261875679359630595715795837939333694056692953617077290030676459281218578044754236976994457097401172359470109498529296892483489384488461202901916083392300861779680090077181505893710321463758029409577389297666918447580531492394294312022253607251169070143541696305881176305678794312168269627285E+15966 

Спасибо за вашу помощь.

+0

Если это для изучения цели, то круто, идти с ней. если вам просто нужен PI в вашей программе, используйте 'Math.PI'. –

+1

1130, а не 1103 –

+1

'ans = ans.multiply (a);' в конце вашего цикла не должно быть. Эта математика должна быть выполнена ** после ** суммирование завершено. –

ответ

6

Вы вообще не применяете 2*sqrt(2)/9801 (a) к уравнению. По существу переменная a не используется прямо сейчас.

Просто измените конец main метода следующим образом:

// i moved a down here because its not used above this location. 
BigDecimal a = (root2.multiply(new BigDecimal("2"))).divide(new BigDecimal("9801"), mc); 
ans = new BigDecimal("1").divide(ans.multiply(a), mc); 
System.out.println(ans); 

Запуск этого на моей машине печатает 3.141592

+0

Ха-ха, я забыл, что спасибо! – Paul

+0

@Paul Вы можете помочь уменьшить проблемы, подобные этому, из-за того, что вы делаете новые привычки в своей кодировке. Попробуйте объявить переменные только до того, как они будут использоваться и в наименьшей возможной области. В этом случае перед их применением объявите 'a' и' root2'. Кроме того, использование IDE поможет значительно сохранить код и найти ошибки. Например, когда я помещаю этот код в свой Eclipse, он быстро подчеркивал переменную 'a', говорящую, что она не используется. –

+0

Спасибо, я действительно использовал eclipse, чтобы закодировать это, но у меня не было этого варианта, по-видимому. Кроме того, спасибо за советы, я постараюсь изо всех сил реализовать их :) – Paul