Biblioteka matematyczna
Pisząc programy często okazuje się, że podstawowe działania matematyczne, jakie udostępnia nam C++ są niewystarczające. Z pomocą przychodzi tu kolejna biblioteka:
math.h.
Stałe matematyczne
Dwoma podstawowymi stałymi, jakie najczęściej przyjdzie nam wykorzystywać z biblioteki matematycznej to liczba
pi i stała
e. Wartość liczby
pi możemy odczytać ze stałej
M_PI, natomiast wartość liczby
e ze stałej
M_E.
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
cout << "Wartosc liczby 'pi' wynosi: " << M_PI << endl;
cout << "Wartosc liczby 'e' wynosi:" << M_E << endl;
getch();
return( 0 );
}
Ważne, jest tu podkreślenie faktu, że strumień cout ogranicza automatycznie ilość wyświetlanych liczb po przecinku. Jeśli będziesz wykorzystywał stałe matematyczne z biblioteki
math.h z pewnością nie musisz się martwić o dokładność wyników, ponieważ stałe te zawierają conajmniej 18 cyfr po przecinku.
Zaokrąglanie liczb
Wraz z dołączeniem pliku nagłówkowego
math.h poza stałymi dostajemy bardzo dużą ilość funkcji. Pierwszymi funkcjami, które chcę omówić to funkcje zaokrąglające liczbę i są to:
double round( double );
double ceil( double );
double floor( double );
Każda z tych funkcji przyjmuje jako jedyny parametr liczbę rzeczywistą i zwraca zaokrągloną liczbę typu rzeczywistego (zmiennoprzecinkowego). Różnice są natomiast w wynikach, jakie otrzymamy z każdej z tych funkcji.
Funkcja round
Funkcja
round odpowiada standardowemu zaokrąglaniu, jakie znamy ze szkoły. Każda liczba, której pierwsza liczba po przecinku jest większa lub równa 5 jest zaokrąglana w górę, natomiast w przeciwnym przypadku liczba jest zaokrąglana w dół.
Funkcja ceil
Funkcja
ceil zaokrągla liczby zawsze w górę. Tak więc, liczba np.
3.0001 zostanie zaokrąglona do
4.
Funkcja floor
Funkcja
floor zaokrągla liczby zawsze w dół. Przykładowo liczba
5.9999 zostanie zaokrąglona do
5.
Tabela porównawcza funkcji zaokrąglających
W celu lepszego zobrazowania zachowania każdej z wymienionych funkcji prezentuję tabelę, pokazującą jak przykładowe liczby będą zaokrąglane w zależności od użytej funkcji.
Przykład
Jeśli nadal masz wątpliwości co do działania tych funkcji, zamieszczam przykład, który powinien rozwiać Twoje ewentualne pytania pod warunkiem, że skompilujesz go i potestujesz.
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
double liczba;
cout << "Podaj liczbe: ";
cin >> liczba;
cout << "round(" << liczba << ")=" << round( liczba ) << endl;
cout << "ceil(" << liczba << ")=" << ceil( liczba ) << endl;
cout << "floor(" << liczba << ")=" << floor( liczba ) << endl;
getch();
return( 0 );
}
Podstawowe funkcje trygonometryczne
Jak nie trudno się domyślić po nazwie działu omówione zostaną tu trzy podstawowe funkcje trygonometryczne: sinus, cosinus i tangens.
double sin( double );
double cos( double );
double tan( double );
Wszystkie wymienione wyżej funkcje przyjmują jako parametr wejściowy kąt. Kąt dla tych funkcji musimy podawać w radianach. Używając funkcji trygonometrycznych nie należy zapominać o asymptotach jakie występują w niektórych funkcjach i należy pamiętać o zabezpieczaniu programów przed ewentualnymi błędami, jakie mogą się pojawić w wyniku wykonywania nieprawidłowych działań matematycznych.
Funkcje te wykorzystuje się analogicznie do
round,
ceil i
floor.
Zamiana stopni na radiany
Jeśli uważałeś na lekcjach w szkole, powinieneś wiedzieć, że
PI == 180 stopni. Stąd wyznaczenie wzoru przekształcającego dowolny kąt na radiany jest już bardzo proste i formuła zapisana w C++ będzie wyglądała następująco:
double stopnie;
cout << "Podaj kat w stopniach: ";
cin >> stopnie;
double radiany =( stopnie * M_PI ) / 180.0f;
Potęgowanie liczb
Jeśli mamy potrzebę podnieść jakąkolwiek liczbę do dowolnej potęgi możemy to zrobić używając funkcji
pow. Funkcja ta przyjmuje dwa parametry i zwraca wynik potęgowania. Pierwszym parametrem jest liczba, którą chcemy potęgować, drugim natomiast potęga do której chcemy wybraną liczbę podnieść.
double pow( double, double );
Przykład
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
double liczba, potega;
cout << "Podaj liczbe: ";
cin >> liczba;
cout << "Do ktorej potegi podniesc liczbe " << liczba << "? Wpisz wartosc: ";
cin >> potega;
cout << "pow(" << liczba << "," << potega << ")=" << pow( liczba, potega ) << endl;
getch();
return( 0 );
}
Pierwiastek stopnia drugiego
Biblioteka
math.h została również wyposażona w funkcję
sqrt. Służy ona do obliczenia pierwiastka stopnia drugiego. Pierwszym i jedynym parametrem tej funkcji jest liczba z której chcemy policzyć pierwiastek. Funkcja zwraca wartość pierwiastka z liczby, którą przekazaliśmy parametrem do funkcji.
Pamiętaj, że pierwiastek z liczby ujemnej nie istnieje (w ciele liczb rzeczywistych, na których są dokonywane obliczenia w komputerze). Gdy używasz jakichkolwiek funkcji matematycznych myśl jak matematyk, nie jak informatyk. Unikniesz później błędów i co ważniejsze nerwów jakie mogą się z błędami wiązać.
Pierwiastki wyższego stopnia
Jeśli chcesz policzyć wartość pierwiastka dowolnego stopnia, powinieneś tu skorzystać z funkcji
pow.
sqrt( liczba ) == pow( liczba,( 1 / 2.0 ) )
Czyli jeśli chcemy uzyskać pierwiastek stopnia piątego, zapis będzie następujący:
double liczba;
cout << "Podaj liczbe: ";
cin >> liczba;
double wynik = pow( liczba,( 1 / 5.0 ) );
cout << "Pierwiastek stopnia piatego z liczby " << liczba << " to: " << wynik << endl;
Logarytmy
Ostatnimi funkcjami, jakie postanowiłem jeszcze omówić z biblioteki
math.h to logarytmy. Funkcja
log i
log10 przyjmują po jednym parametrze wejściowym. Obie funkcje obliczają logarytm z liczby przekazanej przez parametr po czym zwracają wynik. Wyniki jednak będą różne, ponieważ funkcja
log to logarytm naturalny (czyli o podstawie e), natomiast funkcja
log10 to logarytm o podstawie
10.
double log( double );
double log10( double );
Jeśli wymienione funkcje będą dla Ciebie niewystarczające będziesz zmuszony poszukać informacji na ten temat w Internecie.
Pozostałe informacje
Biblioteka
math.h zawiera znacznie więcej stałych i funkcji niż te, które zostały w tym rozdziale wymienione. Po raz kolejny odsyłam Cię do innych źródeł i zachęcam do skorzystania ze strony
http://forum.ddt.pl, jeśli będzie taka potrzeba.