Funkcje matematyczne C - C mathematical functions
Biblioteka standardowa C |
---|
Tematy ogólne |
Różne nagłówki |
C operacje matematyczne są grupą funkcji w bibliotece standardowej w języku programowania C realizacji podstawowych funkcji matematycznych. Wszystkie funkcje używają liczb zmiennoprzecinkowych w taki czy inny sposób. Różne standardy C zapewniają różne, aczkolwiek kompatybilne wstecz, zestawy funkcji. Większość z tych funkcji jest również dostępna w standardowej bibliotece C++ , chociaż w różnych nagłówkach (nagłówki C są również zawarte, ale tylko jako przestarzała funkcja kompatybilności).
Przegląd funkcji
Większość funkcji matematycznych jest zdefiniowana w <math.h>
( <cmath>
nagłówku w C++). Funkcje, które działają na liczbach całkowitych, takie jak abs
, labs
, div
i ldiv
, są zamiast tego zdefiniowane w <stdlib.h>
nagłówku ( <cstdlib>
nagłówek w C++).
Wszelkie funkcje operujące na kątach używają radianów jako jednostki kąta.
Nie wszystkie z tych funkcji są dostępne w wersji standardu C89 . W przypadku tych, które są, funkcje akceptują tylko typ double
dla argumentów zmiennoprzecinkowych, co prowadzi do kosztownych konwersji typów w kodzie, który w przeciwnym razie używał float
wartości o pojedynczej precyzji . W C99 to niedociągnięcie zostało naprawione przez wprowadzenie nowych zestawów funkcji, które działają float
i long double
argumentów. Funkcje te są odpowiednio identyfikowane przez f
i l
przyrostki.
Funkcjonować | Opis | |
---|---|---|
abs labs llabs
|
oblicza wartość bezwzględną liczby całkowitej | |
fabs
|
oblicza wartość bezwzględną wartości zmiennoprzecinkowej | |
div ldiv lldiv
|
oblicza iloraz i resztę z dzielenia liczb całkowitych | |
fmod
|
pozostała część operacji dzielenia zmiennoprzecinkowego | |
remainder
|
podpisana pozostała część operacji podziału | |
remquo
|
podpisana reszta oraz trzy ostatnie bity operacji dzielenia | |
fma
|
skondensowana operacja mnożenia i dodawania | |
fmax
|
większa z dwóch wartości zmiennoprzecinkowych | |
fmin
|
mniejsza z dwóch wartości zmiennoprzecinkowych | |
fdim
|
dodatnia różnica dwóch wartości zmiennoprzecinkowych | |
nan nanf nanl
|
zwraca NaN (nie-liczbę) | |
Funkcje wykładnicze |
exp
|
zwraca e podniesione do danej potęgi |
exp2
|
zwraca 2 podniesione do podanej potęgi | |
expm1
|
zwraca e podniesione do danej potęgi, minus jeden | |
log
|
oblicza logarytm naturalny (o podstawie e) | |
log2
|
oblicza logarytm binarny (o podstawie 2) | |
log10
|
oblicza logarytm pospolity (o podstawie 10) | |
log1p
|
oblicza logarytm naturalny (o podstawie e) z 1 plus podana liczba | |
ilogb
|
wyodrębnia wykładnik liczby | |
logb
|
wyodrębnia wykładnik liczby | |
Funkcje zasilania |
sqrt
|
oblicza pierwiastek kwadratowy |
cbrt
|
oblicza pierwiastek sześcienny | |
hypot
|
oblicza pierwiastek kwadratowy z sumy kwadratów dwóch podanych liczb | |
pow
|
podnosi liczbę do podanej potęgi | |
trygonometryczne funkcje |
sin
|
oblicza sinus |
cos
|
oblicza cosinus | |
tan
|
oblicza styczną | |
asin
|
oblicza arcus sinus | |
acos
|
oblicza arcus cosinus | |
atan
|
oblicza arcus tangens | |
atan2
|
oblicza arcus tangens, używając znaków do wyznaczenia ćwiartek | |
Funkcje hiperboliczne |
sinh
|
oblicza sinus hiperboliczny |
cosh
|
oblicza cosinus hiperboliczny | |
tanh
|
oblicza tangens hiperboliczny | |
asinh
|
oblicza arcus sinus hiperboliczny | |
acosh
|
oblicza arcus cosinus hiperboliczny | |
atanh
|
oblicza łuk hiperboliczny tangens | |
Funkcje
błędu i gamma |
erf
|
oblicza funkcję błędu |
erfc
|
oblicza komplementarną funkcję błędu | |
lgamma
|
oblicza logarytm naturalny wartości bezwzględnej funkcji gamma | |
tgamma
|
oblicza funkcję gamma | |
Najbliższe całkowite o zmiennym punktowe operacje |
ceil
|
zwraca najbliższą liczbę całkowitą nie mniejszą niż podana wartość |
floor
|
zwraca najbliższą liczbę całkowitą nie większą niż podana wartość | |
trunc
|
zwraca najbliższą liczbę całkowitą nie większą niż podana wartość | |
round lround llround
|
zwraca najbliższą liczbę całkowitą, zaokrąglając od zera w przypadkach połowicznych | |
nearbyint
|
zwraca najbliższą liczbę całkowitą przy użyciu bieżącego trybu zaokrąglania | |
rint lrint llrint
|
zwraca najbliższą liczbę całkowitą przy użyciu bieżącego trybu zaokrąglania, z wyjątkiem sytuacji, gdy wynik jest inny | |
O zmiennym punkt manipulacji funkcje |
frexp
|
rozkłada liczbę na znaczące i potęgę 2 |
ldexp
|
mnoży liczbę przez 2 podniesioną do potęgi | |
modf
|
rozkłada liczbę na części całkowite i ułamkowe | |
scalbn scalbln
|
mnoży liczbę przez FLT_RADIX podniesioną do potęgi | |
nextafter nexttoward
|
zwraca następną reprezentowalną wartość zmiennoprzecinkową w kierunku podanej wartości | |
copysign
|
kopiuje znak wartości zmiennoprzecinkowej | |
Klasyfikacja |
fpclassify
|
kategoryzuje daną wartość zmiennoprzecinkową |
isfinite
|
sprawdza, czy argument ma skończoną wartość | |
isinf
|
sprawdza, czy argument jest nieskończony | |
isnan
|
sprawdza, czy argumentem jest NaN | |
isnormal
|
sprawdza, czy argument jest normalny | |
signbit
|
sprawdza, czy znak argumentu jest ujemny |
Środowisko zmiennoprzecinkowe
C99 dodaje kilka funkcji i typów do precyzyjnej kontroli środowiska zmiennoprzecinkowego. Funkcje te mogą być używane do kontrolowania różnych ustawień, które mają wpływ na obliczenia zmiennoprzecinkowe, na przykład tryb zaokrąglania, na jakich warunkach występują wyjątki, gdy liczby są wyrównywane do zera itp. Funkcje i typy środowiska zmiennoprzecinkowego są zdefiniowane w <fenv.h>
nagłówku ( <cfenv>
w C++ ).
Funkcjonować | Opis |
---|---|
feclearexcept
|
usuwa wyjątki ( C99 ) |
fegetenv
|
przechowuje bieżące środowisko zmiennoprzecinkowe ( C99 ) |
fegetexceptflag
|
przechowuje aktualne flagi stanu ( C99 ) |
fegetround
|
pobiera bieżący kierunek zaokrąglania ( C99 ) |
feholdexcept
|
zapisuje bieżące środowisko zmiennoprzecinkowe i usuwa wszystkie wyjątki ( C99 ) |
feraiseexcept
|
zgłasza wyjątek zmiennoprzecinkowy ( C99 ) |
fesetenv
|
ustawia bieżące środowisko zmiennoprzecinkowe ( C99 ) |
fesetexceptflag
|
ustawia flagi aktualnego stanu ( C99 ) |
fesetround
|
ustawia aktualny kierunek zaokrąglania ( C99 ) |
fetestexcept
|
testuje, czy zgłoszono pewne wyjątki ( C99 ) |
feupdateenv
|
przywraca środowisko zmiennoprzecinkowe, ale zachowuje bieżące wyjątki ( C99 ) |
Liczby zespolone
C99 dodaje nowe _Complex
słowo kluczowe (i complex
makro wygody), które zapewnia obsługę liczb zespolonych. Dowolny typ zmiennoprzecinkowy można modyfikować za pomocą complex
, a następnie jest definiowany jako para liczb zmiennoprzecinkowych. Zwróć uwagę, że C99 i C++ nie implementują liczb zespolonych w sposób zgodny z kodem — ten drugi zamiast tego udostępnia klasę .
std::complex
Wszystkie operacje na liczbach zespolonych są zdefiniowane w <complex.h>
nagłówku. Podobnie jak w przypadku funkcji o wartościach rzeczywistych, przyrostek f
lub l
oznacza wariant float complex
lub long double complex
wariant funkcji.
Funkcjonować | Opis | |
---|---|---|
Podstawowe operacje |
cabs
|
oblicza wartość bezwzględną ( C99 ) |
carg
|
oblicza argument liczby zespolonej ( C99 ) | |
cimag
|
oblicza część urojoną liczby zespolonej ( C99 ) | |
creal
|
oblicza część rzeczywistą liczby zespolonej ( C99 ) | |
oblicza sprzężenie zespolone ( C99 ) | ||
cproj
|
oblicza odwzorowanie złożone na sferę Riemanna ( C99 ) | |
Operacje potęgowania |
cexp
|
oblicza złożone wykładnicze ( C99 ) |
clog
|
oblicza logarytm zespolony ( C99 ) | |
csqrt
|
oblicza złożony pierwiastek kwadratowy ( C99 ) | |
cpow
|
oblicza moc zespoloną ( C99 ) | |
Operacje trygonometryczne |
csin
|
oblicza sinus zespolony ( C99 ) |
ccos
|
oblicza zespolony cosinus ( C99 ) | |
ctan
|
oblicza styczną zespoloną ( C99 ) | |
casin
|
oblicza złożony łuk sinusoidalny ( C99 ) | |
cacos
|
oblicza zespolony arcus cosinus ( C99 ) | |
catan
|
oblicza złożony łuk tangens ( C99 ) | |
Operacje hiperboliczne |
csinh
|
oblicza złożony sinus hiperboliczny ( C99 ) |
ccosh
|
oblicza złożony cosinus hiperboliczny ( C99 ) | |
ctanh
|
oblicza złożony tangens hiperboliczny ( C99 ) | |
casinh
|
oblicza złożony łuk hiperboliczny arcus sinus ( C99 ) | |
cacosh
|
oblicza złożony arcus cosinus hiperboliczny ( C99 ) | |
catanh
|
oblicza złożony łuk hiperboliczny tangens ( C99 ) |
Kilka bardziej złożonych funkcji jest „zarezerwowanych do przyszłego użytku w C99”. Implementacje są dostarczane przez projekty typu open source, które nie są częścią standardowej biblioteki.
Funkcjonować | Opis | |
---|---|---|
Funkcje błędów |
cerf
|
oblicza złożoną funkcję błędu ( C99 ) |
cerfc
|
oblicza zespoloną komplementarną funkcję błędu ( C99 ) |
Funkcje ogólne typu
Nagłówek <tgmath.h>
definiuje ogólne makro typu dla każdej funkcji matematycznej zdefiniowanej w <math.h>
i <complex.h>
. Dodaje to ograniczoną obsługę przeciążania funkcji funkcji matematycznych: ta sama nazwa funkcji może być używana z różnymi typami parametrów; rzeczywista funkcja zostanie wybrana w czasie kompilacji zgodnie z typami parametrów.
Każde makro ogólne, które odpowiada funkcji zdefiniowanej zarówno dla liczb rzeczywistych, jak i zespolonych, zawiera w sumie 6 różnych funkcji: float
, double
i long double
i ich complex
wariantów. Makra Typ-generic odpowiadające funkcji, która jest zdefiniowana tylko dla liczb rzeczywistych obudowuje w sumie 3 różnych funkcji: float
, double
i long double
warianty funkcji.
Język C++ zawiera natywną obsługę przeciążania funkcji, a zatem nie zapewnia <tgmath.h>
nagłówka nawet jako funkcji zgodności.
Generowanie liczb losowych
Nagłówek <stdlib.h>
( <cstdlib>
w C++) definiuje kilka funkcji, których można użyć do generowania liczb losowych statystycznie.
Funkcjonować | Opis |
---|---|
rand
|
generuje liczbę pseudolosową z zakresu od 0 do RAND_MAX .
|
srand
|
inicjuje generator liczb pseudolosowych |
arc4random
|
generuje liczbę pseudolosową z zakresu od 0 do UINT32_MAX , zwykle przy użyciu lepszego algorytmu niżrand
|
arc4random_uniform
|
generuje liczbę pseudolosową z zakresu od 0 do wartości maksymalnej. |
arc4random_buf
|
wypełnić bufor pseudolosowym strumieniem bitów. |
arc4random_stir
|
inicjuje generator liczb pseudolosowych . |
arc4random
Rodzina losowych funkcji numerycznych nie są zdefiniowane w standardzie POSIX, ale stwierdzono, że w niektórych wspólnych libc
wdrożeń. To odnosi się do generatora strumienia klucza z wyciekły wersji RC4 szyfr (stąd „ lleged RC4 ”), ale różne algorytmy, zwykle z innych szyfrów jak ChaCha20 , zostały wdrożone, ponieważ stosując tę samą nazwę.
Jakość losowości z rand
jest zwykle zbyt słaba, aby można ją było nawet uznać za statystycznie losową, i wymaga jawnego zasiewu. Zwykle zaleca się używanie arc4random
zamiast, rand
gdy to możliwe. Niektóre biblioteki C wdrożyć rand
za pomocą arc4random_uniform
wewnętrznie.
Realizacje
W systemach POSIX , takich jak Linux i BSD , funkcje matematyczne (jak zadeklarowane w <math.h>
) są pakowane oddzielnie w bibliotece matematycznej . W związku z tym, jeśli którakolwiek z tych funkcji jest używana, linker musi otrzymać dyrektywę . Istnieją różne implementacje, w tym:
libm
-lm
libm
- LIBC „s libm
- AMD „s libm
- Red Hat 's libm
- Sun „s FDLIBM , który został użyty jako podstawa dla FreeBSD ” s msun i OpenBSD „s libm , z których oba były z kolei podstawą Julia ” s OpenLibm
- MUSL dydaktycznego libm , na podstawie libms BSD i innych projektów, takich jak ARM
- CRlibm projektu Arénaire ( poprawnie zaokrąglony libm) i jego następca MetaLibm . Wykorzystuje algorytm Remez do automatycznego generowania aproksymacji, które są formalnie sprawdzone.
Realizacje niekoniecznie pod nazwą libm
obejmują:
- ARM „s zoptymalizowane procedury matematyczne
-
GCE-Math to wersja funkcji matematycznych C/C++ napisana dla C++
constexpr
(obliczanie czasu kompilacji) - Biblioteki matematyczne SIMD (wektoryzowane) obejmują SLEEF , Yeppp! , oraz VCL Agner Fog , a także kilka zamkniętych źródeł, takich jak SVML i DirectXMath.
Zobacz też
Bibliografia
Linki zewnętrzne
- The Single UNIX Specification , wydanie 7 z The Open Group : deklaracje matematyczne – Base Definitions Reference,
- C odniesienia dla funkcji matematycznych