W Javie często wykorzystuje się różne funkcje matematyczne jak pierwiastek, wartość bezwzględna, sinus i inne funkcje trygonometryczne.
Aby z nich korzystać musimy poznać bibliotekę Math z pakietu java.lang. Kilka najważniejszych funkcji znajduje się poniżej.

  • sqrt(double liczba) – zwraca pierwiastek z liczby double. Jako parametr możemy również podać dowolny typ liczbowy, wtedy nastąpi jego automatyczna konwersja na double.
  • pow(double a, double b) – zwraca liczbę a podniesioną do potęgi b
  • abs(liczba) – parametrem może być dowolna liczba, metoda zwraca wartość bezwzględną z argumentu
  • więcej funkcji znajdziecie w API Javy tutaj

Wszystkie metody są statyczne, aby je wywołać należy użyć konstrukcji:

Math.nazwa_metody(argumenty)

Zobaczmy to na praktycznym przykładzie programu, który obliczy pierwiastek z liczby, a następnie podnosi ją do 3 potęgi.

public class Funkcje{
  public static void main(String[] args){
    double liczba = 9.0;
    int b = 3;
    double pierwiastek = Math.sqrt(liczba);
    double potega = Math.pow(liczba, b);

    System.out.println("Pierwiastek z "+liczba+" wynosi: "+pierwiastek);
    System.out.println("Liczba "+liczba+" podniesiona do potegi "+b+" to "+potega);
  }
}

Najpierw deklarujemy zmienne: liczba-nasza główna liczba, b – potęga, a następnie korzystając z funkcji matematycznych obliczamy pierwiastek i potęgę. Na końcu wyświetlamy nasze wyniki na konsoli.

Ciekawym zagadnieniem o którym warto tutaj wspomnieć jest import statyczny. Dzięki jego zastosowaniu będziemy mogli pomijać przedrostki Math przed nazwami funkcji. Poniżej powyższy przykład z jego zastosowaniem.

import static java.lang.Math.*;

public class Funkcje{
  public static void main(String[] args){
    double liczba = 9.0;
    int b = 3;
    double pierwiastek = sqrt(liczba);
    double potega = pow(liczba, b);

    System.out.println("Pierwiastek z "+liczba+" wynosi: "+pierwiastek);
    System.out.println("Liczba "+liczba+" podniesiona do potegi "+b+" to "+potega);
  }
}

jak widać przed rozpoczęciem ciała klasy musieliśmy dodać nagłówek w postaci

import static java.lang.Math.*;

Jest to bardzo przydatna rzecz w przypadku, gdy w naszym programie będziemy musieli często wykorzystywać funkcje matematyczne, zaoszczędzi nam to pisania i poprawi czytelność kodu.

W klasie Math występują także dwie stałe PI oraz E, dzięki nim nie musimy deklarować własnych liczb pi oraz e. Wywołujemy je podobnie jak funkcje.

Math.PI
Math.E

Wielkie liczby.

Może się zdarzyć, że nawet zakres typów long, czy double nie wystarczy do naszych obliczeń. Co wtedy zrobić? W Javie istnieją dwie klasy do przechowywania naprawdę ogromnych liczb oferujące dodatkowe funkcje matematyczne i nadające się także do precyzyjnych obliczeń matematycznych, na przykład w bankowości.

  • BigInteger – klasa dla wielkich liczb całkowitych
  • BigDecimal – klasa dla wielkich liczb zmiennoprzecinkowych

Ich używanie w tradycyjnych programach nie jest zbyt wygodne, ponieważ nie można zrobić bezpośredniego przypisania wartości BigInteger przykładowo do wartości int, mimo, że BigInteger przechowywałaby liczbę z zakresu int. Jest to spowodowane tym, że klasa BigInteger jest typem obiektowym. Obie klasy posiadają także stałe, które są często wykorzystywane, najważniejsze to

BigInteger.ONE / BigDecimal.ONE
BigInteger.ZERO / BigDecimal.ZERO

Aby utworzyć nową zmienną typu BigInteger, lub BigDecimal musimy najpierw utworzyć obiekt (nie musisz się na razie zbytnio zagłębiać w temat wielkich liczb, ale na końcu będzie jedno zadanie z ich wykorzystaniem). W nagłówku trzeba oczywiście też zaimportować używaną klasę.

import java.math.BigInteger;

public class WielkaLiczba{
  public static void main(String[] args){
    BigInteger wielkaLiczba = new BigInteger("12312312312312312312");
    System.out.println(wielkaLiczba.toString());
  }
}

Najpierw tworzymy wielką liczbę typu, zauważ, że podajemy ją w formie Stringa. Jednak można również użyć innej formy.

 BigInteger wielkaLiczba = BigInteger.valueOf(123123);

W tym przypadku trzeba jednak pamiętać, aby argument metody valueOf() nie przekroczył zakresu typu long, lub double w przypadku klasy BigDecimal. Przy sposobie ze Stringiem mogą one być praktycznie nieograniczone. Aby dodać dwie ogromne liczby nie możemy korzystać ze standardowych operatorów, należy w takim wypadku skorzystać z gotowych funkcji: add(), subtract(), multiply(), divide().

import java.math.BigInteger;

public class WielkieLiczby{
  public static void main(String[] args){
    BigInteger a = new BigInteger("123123123123123123123123123123");
    BigInteger b = new BigInteger("987654321987654321987654321987");
    BigInteger suma = a.add(b);
    System.out.println("Suma "+suma.toString());
  }
}

Stworzyliśmy tutaj dwie wielkie liczby a i b. Następnie obliczamy ich sumę dzięki konstrukcji a.add(b), która zwraca wynik dodawania dwóch liczb typu BigInteger. Wyświetlamy wynik dzięki temu, że klasa BigInteger posiada metodę toString() konwertującą liczbę na łańcuch znaków.

Zadania do samodzielnego wykonania.

1.4 Napisz prosty kalkulator, w którym zainicjujesz dwie zmienne int a i b dowolnymi liczbami mieszczącymi się w zakresie – niech a będzie liczbą ujemną, natomiast b dodatnią… Następnie wykorzystując import statyczny wyświetl wyniki następujących działań bez użycia dodatkowych zmiennych:

-a^b (a do potęgi b)
-|a| (wartość bezwzględna z liczby a)
-pierwiastek z liczby a podniesionej do potęgi b.

Zobacz co się stanie, gdy do a i b przypiszesz dwie 3 cyfrowe liczby, oraz gdy liczba b będzie nieparzysta (wynik a^b będzie ujemny).

Rozwiązanie,

1.5 Napisz program analogiczny do 1.4 wykorzystując klasę BigInteger. Utwórz dwie liczby wykraczające poza zakres long, wypróbuj funkcje dodawania, odejmowania i mnożenia, a także podniesienie do potęgi(zobacz w API jaki typ parametru przyjmuje ta funkcja) i wartość bezwzględną. Wszystkie wyniki zaprezentuj w konsoli.

Rozwiązanie.

<- Poprzednia LekcjaNastępna Lekcja ->