Przekroczenie zakresu typu double

0

Witam!
Nie jestem pewien czy nazwa tematu jest odpowiednia, ale tak czy tak opiszę mój problem.

Mianowicie...

Rzecz w tym, że mam napisać program do liczenia kilku zagadnień matematycznych takich jak silnia i tak dalej. Weźmy tą silnię pod młotek. Licząc małe silnie, rzędu do 18! to wszystko gra. Problem pojawia się, gdy chce obliczyć 19! i więcej. Wtedy mój program kończy działanie(każde od 19! do x!) wynikiem 92233720368547760. Jak sprawić, żeby program prawidłowo liczył wyższe silnie? Pomoże ktoś? Nie chcę się tutaj "chwalić" kodem. Powiem tylko, że działam na typie double, bo tak mi zostało zlecone zadanie. BigDecimal czy BigInteger nie wchodzi w grę. Da się w ogóle coś takiego wykonać czy zostałem wpuszczony w maliny?

1

Jak sprawić, żeby program prawidłowo liczył wyższe silnie? Pomoże ktoś? Nie chcę się tutaj "chwalić" kodem.

Najpierw wyślij szklaną kulę. Względnie możesz po prostu napisać program poprawnie.

Z wikipedii:
max double = 1.7976931348623157 × 10^308

Spokojnie możesz policzyć np silnię ze stu. Tyle, że wynik będzie przybliżony.

0

Silnie liczę metodą rekurencyjną:

static public double Silnia(double ekran)
    {
        if (ekran == 0) 
            return 1;
        else 
            return ekran * Silnia(ekran - 1);
    }

Funkcję wywołuję z parametrem double i wtedy pakuję w okienko:
this.jTextField1.setText((String.valueOf(df.format(wynik))));

Wiem, może niezbyt profesjonalne. Bawiłem sie DecimalFormat, stąd tam df.format.

1

A zmienna wynik jaki ma typ? Zamień to setText(whatever) na setText(String.valueOf(wynik)) gdzie wynik ma typ double i nie ma żadnych konwersji na longi czy cokolwiek po drodze.

PS:
Z ciekawości wyguglałem liczbę która podałeś i znalazłem to: http://stackoverflow.com/ques[...]va-numeric-types-to-as3-types

PS2:
Parametr do silni powinien być typu int.

0

Korzystając z typu long dojedziesz do 20!, a korzystając z typu double dojedziesz do 21!. Dalsze wartości są już przybliżone.

0

Zamień to setText(whatever) na setText(String.valueOf(wynik)) gdzie wynik ma typ double i nie ma żadnych konwersji na longi czy cokolwiek po drodze.

Miałem tak na początku, to nawet 12! zapisywało w notacji wykładniczej, a tego nie potrzebuję.
Zmiana na int też nie pomogła w niczym.

1

A wynik w notacji wykładniczej był prawidłowy?

Jeszcze 15 postów i dowiemy się w którym miejscu jest błąd :]

Jaki jest typ zmiennej wynik? Jest gdzieś rzutowanie na longa (implicite lub explicite)? Jak wygląda ten decimalformat?

Zamiana parametru na int nie ma pomóc tylko ma sprawić że kod będzie mniej WTFowy. Silnię oblicza się z argumentu będącego liczbą naturalną, a nie rzeczywistą.

0

Dobra. wynik jest typu double. Wynik w postaci wykładniczej był ten sam tyle że po pierwszej dziewiątce miałem kropeczkę i na końcu Ex, gdzie x to liczba w zależności od wielkości silni. DF wygląda tak:

DecimalFormat df = new DecimalFormat("#");

A, i może jeszcze istotny fakt(może). Dane pobieram z TextFielda, przez parsowanie do double. Później żeby zapisać wynik w TextFieldzie, parsuję wynik do Stringa

0
DecimalFormat df = new DecimalFormat("#############################################################################");
setText(df.format(wynik));

Hashy może być trochę mniej.

0

Nie pomogło :<

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