Zadanie z liczbą Pi

0

Siemka, ostatnio bardzo mi pomogliście z zadaniem z Javki, dlatego dzisiaj przychodzę z kolejnym pytaniem.
W pierwszej części zadania miałam napisać metodę, która wylicza liczbę Pi na podstawie podanego wzoru, ale teraz mam drugą część zadanie w której:

używając metody 1 mam znaleźć ile ma wynosić n, żeby liczba Pi = 3,141. (była w przybliżeniu do trzeciego miejsca. Mam stworzyć nową metodę. No i moje umiejętności pozwoliły mi na napisani tylko:


  public class HelloWorld{
    public static void main(String []args)
    {
        for(int n = 0; ; n++)
        {
            if(compPi(n) == 3.141)
            {
                System.out.println(n);
                break;
            }
        }
    }
   
   static double compPi(double n)
    {
        double suma = 0;
        for(int k = 0; k <= n; k++)
        {
            double ulamek = (Math.pow(-1, k)) / ((2 * k) + 1);
            suma = suma + ulamek;
        }

        double temp = 4 * suma;
        return temp;
    }
 }

Jak zrobić żeby ta druga część zadania była rzeczywiście drugą metodą?

1
alokin napisał(a):
        if(compPi(n) == 3.141)

Porównanie z 3.141 (w liczbach double) raczej się nie uda. Zmienny przecinek porównuje się z tzw epsylonem. Od groma wątków na ten temat.
Skoro masz uzyskać 3 cyfry po kropce zgodne z teorią, to jaki ma być epsylon?

        double ulamek = (Math.pow(-1, k)) / ((2 * k) + 1);

Math.pow(double, double) do odwracania znaku to overkil, niewydajne, i w dodatku ryzyko utraty dokładności. Majtaj tym znakiem "ręcznie"

0

czy zastosowanie

double temp = Math.ceil((4 * suma)*1000); return temp/1000;

pomoże?

1

Powinieneś sprawdzać czy obecny wynik odbiega od PI o nie więcej niż założony Epsilon (równy np. 0.01).

Btw. liczba PI ma nieskończone rozwinięcie dziesiętne, więc ciężko zastosować tutaj porównanie :)

1

Ten program jest o tyle zły, że liczysz przybliżenie dla każdego n od nowa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1