Niektóre stałe i funkcje z pliku nagłówkowego math.h. Stałe Identyfikator M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4 M_1_PI M_2_PI M_1_SQRTPI M_2_SQRTPI Znaczenie e log 2 (e) log 10 (e) ln(2) ln(10) 2 4 1 2 1 2 M_SQRT2 2 M_SQRT_2 1 2 Biblioteki standardowe Borland C++ zawierają funkcje operujące na liczbach rzeczywistych typu double i typu long double. Dla funkcji, których nazwa zakończona jest literą l argument i wynik są typu long double. Funkcje trygonometryczne: sin,sinl, cos,cosl, tan,tanl obliczające odpowiednio sinus, cosinus i tangens dla zadanego argumentu w radianach. W przypadku tangensa należy pamiętać, że funkcja nie jest określona dla kątów 2 2k, k całkowite. Deklaracja funkcji obliczającej cosinus jest następująca double cos(double x); long double cosl(long double x); Analogicznie dla dwu pozostałych funkcji. 1
Funkcje cyklometryczne: Są to funkcje asin,asinl, acos,acosl, atan, atanl obliczające arcussinus, arcuscosinus oraz arcustangens. Ponadto są funkcje atan2 i atan2l obliczające arcustangens dla ilorazu argumentów. double asin(double x); long double asinl(long double x); Funkcja oblicza arcussinus dla argumentu z przedziału [-1, 1]. Jako wynik otrzymujemy liczbę z przedziału [, ]. 2 2 Podobnie dla acos, acosl z tym, że wynik należy do przedziału [ 0, ]. double atan(double x); long double atanl(long double x); Wartością funkcji jest arcustangens argumentu x. Wartość wynikowa należy do przedziału [, ]. 2 2 double atan2(double x, double y); long double atan2l(long double x, long double y); Wartością funkcji jest arcustangens dla ilorazu argumentów x/y. Zaletą funkcji jest, że zwraca poprawne wartości dla y bliskich zero. Funkcje hiperboliczne Są to funkcje wyznaczania wartości sinusa, cosinusa i tangensa hiperbolicznego: sinh, x x sinhl, cosh, coshl, tanh tanhl. Wartościami ich są odpowiednio: ( e e ) / 2, ( e x x e ) / 2 i sinh(x)/cosh(x). Nagłówek dla sinusa hiperbolicznego jest następujący double sinh(double x); long double sinhl(long double x); i podobnie dla dwu pozostałych funkcji. 2
Funkcje wykładnicze i logarytmiczne exp, expl double exp(double x); long double expl(long double x); oblicza wartość x e. ldexp, ldexpl double ldexp(double x, int wykl); long double expl(long double x, int wykl); oblicza wartość wykl x * 2 funkcje log, logl, log10, log10l pozwalają obliczyć wartość logarytmu naturalnego i logarytmu dziesiętnego. Ich deklaracje są podobne do dotychczas przytaczanych Przykład zastosowania cout << log(m_e); wyświetli wartość 1. W dalszym ciągu nie będziemy przytaczali wszystkich funkcji z przyrostkiem l. Potęgi, pierwiastki i wielomiany Wartość wielomianu można obliczy przy pomocy funkcji poly, polyl double poly(double x, int n, double a[]); oblicza wartość wielomianu stopnia n o współczynnikach w tablicy a dla argumentu x. Postać wielomianu stopnia n jest następująca a n *x n + a n-1 *x n-1....+ a 1 *x + a 0 Przykład: #include <iostream > #include <math.h > using namespace std; /* wielomian: x**3-2x**2 + 5x - 1 */ void main(void) 3
{ } double wspolcz[] = { -1.0, 5.0, -2.0, 1.0}; double result; result = poly(2.0, 3, wspolcz); cout<<"wartość wielomianu: \n x^3-2x^2 + 5x 1 ; cout<< \nw 2.0 wynosi :" << result<<endl; system("pause"); Na ekranie otrzymamy następujące wyniki Wartość wielomianu: x^3-2x^2 + 5x - 1 w 2.0 wynosi :9 Wartość x y można obliczyć przy pomocy funkcji pow, powl double pow(double x, double y); Uwaga: dla x<0, y powinien być całkowitą liczbą. Poprawne jest wywołanie pow(- 2.0,3.0) a pow(-2.0,3.5) jest niepoprawne. Wartość 10 n można obliczyć przy pomocy funkcji pow10, pow10l double pow10(int n); I tak cout <<pow10(3.50); jako wynik daje 1000 ( 3.5 konwertowane jest na typ int). Przy pomocy funkcji sqrt i sqrtl obliczamy wartość pierwiastka kwadratowego. double sqrt(double x); Funkcje zaokrągleń Zaokrąglenie w górę realizują funkcje ceil i ceill. Deklaracja pierwszej to double ceil(double x); Wartością funkcji jest najmniejsza liczba całkowita nie mniejsza niż x. 4
Zaokrąglenie w dół realizują funkcje floor i floorl. Deklaracja double ceil(double x); wartością funkcji jest największa liczba całkowita nie większa niż x. Przykład: x=floor(123.45); // x=123; y=ceil(123.45); // y=124; Inne funkcje Wartość bezwzględną można wyznaczyć przy pomocy int abs(int x); //daje wynik całkowity double fabs(double x); // wynik double long double fabsl(long double x); // wynik long double Funkcje double fmod(double x, double y); i fmodl obliczają resztę z dzielenia x przez y. Reszta f określona jest tak, że x = ay + f dla pewnego całkowitego a, i 0 <=abs(f) < abs(y). Jeśli y = 0 to fmod i fmodl zwracają 0. cout <<fmod(6.44,2.5)<< <<fmod(-6.44,2.5)<< <<fmod(6.44,-2.5)<< <<fmod(-6.44,-2.5); wyświetli na ekranie liczby 1.44-1.44 1.44-1.44 Funkcja double frexp(double x, int *exponent); (jest frexpl) dzieli liczbę rzeczywistą x na mantysę m[0.5,1] i całkowity wykładnik tak aby zachodziła równość x = m*2 n. Obliczona mantysa jest wartością funkcji a wykładnik n jest zapamiętywany w zmiennej wskazywanej przez exponent. 5
Przykład int n; double m;... m = frexp(8, &n); cout<<m<<"*2^"<<n<<endl;... wyświetli 0.5*2^4 Funkcja zadeklarowana double modf(double x, double *ipart); rozdziela liczbę rzeczywistą x na część całkowitą, która jest przypisywana zmiennej wskazywanej przez ipart, i ułamkową, która jest wartością funkcji. (jest również wersja long) I tak ulamek=modf(-100.45,&calkowita); jako wyniki daje ulamek=-0.45 i calkowita=-100. Funkcja double hypot(double x, double y); oblicza wartość sqrt(x*x+y*y); 6
Funkcje konwersji (plik nagłówkowy stdlib.h) Konwersja łańcuch -> liczba całkowita Funkcje o deklaracji int atoi(const char *s); long atol(const char *s); przekształcają łańcuch wskazywany przez parametr s w liczbę całkowitą typu int lub long odpowiednio. Łańcuch musi zawierać zapis w postaci [spacje][znak][ddd] gdzie spacje oznaczają dowolną liczbę znaków spacji lub tabulacji, znak jest + lub -, ddd jest łańcuchem cyfr dziesiętnych. Obie funkcji nie obsługują błędów związanych z przekroczeniem zakresu liczb. Pierwszy nie rozpoznany znak kończy konwersję. Jako wartość zwracana jest dotychczas utworzona liczba lub zero. Przykład: atoi("1234") // 1234; atoi("1234567890123") // przekroczenie zakresu wynik nieokreślony atoi("123.4") // 123 atoi("123w4") //123; atoi(" w1234") // 0 Są również funkcje konwersji dla systemu ósemkowego i szesnastkowego. Liczba całkowita -> łańcuch char *itoa(int value, char *string, int radix); char *ltoa(long value, char *string, int radix); char *ultoa(unsigned long value, char *string, int radix); 7
Funkcje te zamieniają liczbę całkowitą określoną parametrem value na łańcuch reprezentujący ją w systemie o podstawie radix i zapisie znak moduł. Funkcje zwracają adres określony parametrem string. Uwagi: parametr radix powinien być z przedziału [2,36]; w przypadku podania złej podstawy wynikiem jest łańcuch pusty funkcja itoa na wynik może wykorzystać maksymalnie 17 znaków (2 bajty + NULL) a pozostałe dwie 33 znaki. Następujący ciąg instrukcji wyświetli zapis liczby 2015 w różnych systemach liczenia: { char LiczbaStr[20]; for (int i=2; i<37; i++) cout << setw(2)<<i<<" "<< itoa(1999,liczbastr,i)<<endl; } łańcuch -> liczba rzeczywista double atof(const char *s); long double _atold(const char *s); double strtod(const char *s, char **endptr); long double _strtold(const char *s, char **endptr); Dwie pierwsze funkcje osiągalne są również w pliku nagłówkowym math.h. Wynikiem funkcji jest wartość liczby otrzymanej z łańcucha s. Funkcje rozpoznają +INF i -INF jako nieskończoności. Lepszą kontrolę błędów konwersji zapewnia drugi zestaw funkcji. W nich ostatni parametr zawiera adres pierwszego znaku nie wchodzącego w skład liczby rzeczywistej. Dla char *znak,liczba[]="123.56w456"; cout << strtod(liczba,&znak); cout <<" "<<*znak<<endl; otrzymamy na ekranie 123.56 w 8