C matematické funkce - C mathematical functions
C standardní knihovna |
---|
Obecná témata |
Různé záhlaví |
C matematické operace jsou skupinou funkcí v standardní knihovna z Programovací jazyk C. implementace základních matematických funkcí.[1][2] Všechny funkce se používají plovoucí bod čísla tak či onak. Různé standardy C poskytují různé, i když zpětně kompatibilní sady funkcí. Většina z těchto funkcí je k dispozici také v C ++ standardní knihovna, i když v různých záhlavích (jsou zahrnuty také záhlaví C, ale pouze jako zastaralá funkce kompatibility).
Přehled funkcí
Většina matematických funkcí je definována v <math.h>
(<cmath>
záhlaví v C ++). Funkce, které fungují na celá čísla, jako je břišní svaly
, laboratoře
, div
, a ldiv
, jsou místo toho definovány v <stdlib.h>
záhlaví (<cstdlib>
záhlaví v C ++).
Jakékoli funkce, které pracují pod úhlem, používají radiány jako jednotka úhlu.[1]
Ne všechny tyto funkce jsou k dispozici v C89 verze standardu. U těch, které jsou, funkce přijímají pouze typ dvojnásobek
pro argumenty s plovoucí desetinnou čárkou, což vede k nákladným převodům typu v kódu, který by jinak používal jednoduchou přesnost plovák
hodnoty. V C99 byl tento nedostatek opraven zavedením nových sad funkcí, na kterých pracuje plovák
a dlouhý dvojitý
argumenty. Tyto funkce jsou označeny F
a l
přípony.[3]
Funkce | Popis | |
---|---|---|
břišní svaly laboratoře lalabs | počítá absolutní hodnota celočíselné hodnoty | |
báječné | vypočítá absolutní hodnotu hodnoty s plovoucí desetinnou čárkou | |
div ldiv lldiv | vypočítá podíl a zbytek celočíselné dělení | |
fmod | zbytek operace dělení s plovoucí desetinnou čárkou | |
zbytek | podepsaný zbytek operace divize | |
remquo | podepsaný zbytek a tři poslední kousky operace dělení | |
fma | fúzovaný násobit-přidat úkon | |
fmax | větší ze dvou hodnot s plovoucí desetinnou čárkou | |
fmin | menší ze dvou hodnot s plovoucí desetinnou čárkou | |
fdim | kladný rozdíl dvou hodnot s plovoucí desetinnou čárkou | |
nan nanf nanl | vrací a ne-číslo (NaN) | |
Exponenciální funkce | exp | se vrací E povýšen na danou sílu |
exp2 | vrátí 2 povýšené na danou sílu | |
expm1 | vrátí e zvýšený na danou mocninu, mínus jedna | |
log | počítá přirozený logaritmus (založit e) | |
log2 | počítá binární logaritmus (do základny 2) | |
log10 | počítá společný logaritmus (do základny 10) | |
log1p | spočítá přirozený logaritmus (do základu e) 1 plus dané číslo | |
ilogb | extrahuje exponent čísla | |
logb | extrahuje exponent čísla | |
Napájení funkce | čtv | počítá odmocnina |
cbrt | počítá krychlový kořen | |
hypot | počítá druhá odmocnina součtu čtverců dvou daných čísel | |
prášek | zvýší číslo na danou mocninu[4] | |
Trigonometrický funkce | hřích | počítá sinus |
cos | počítá kosinus | |
opálení | počítá tečna | |
jako v | počítá oblouk sine | |
acos | počítá kosmický oblouk | |
opálení | počítá tečna oblouku | |
atan2 | počítá tangenciální oblouk, pomocí značek určovat kvadranty | |
Hyperbolický funkce | sinh | počítá hyperbolický sinus |
hovno | počítá hyperbolický kosinus | |
tanh | počítá hyperbolickou tečnu | |
asinh | počítá sinus hyperbolického oblouku | |
acosh | počítá kosinus hyperbolického oblouku | |
atanh | vypočítá tangens hyperbolického oblouku | |
Chyba a gama funkce | erf | počítá chybová funkce |
erfc | počítá doplňková chybová funkce | |
lgamma | počítá přirozený logaritmus absolutní hodnoty funkce gama | |
tgamma | počítá gama funkci | |
Nejbližší celé číslo plovoucí- směřovat operace | strop | vrátí nejbližší celé číslo, které není menší než zadaná hodnota |
podlaha | vrací nejbližší celé číslo, které není větší než zadaná hodnota | |
trunc | vrací nejbližší celé číslo, jehož velikost není větší než zadaná hodnota | |
kolo kolem kolem | vrací nejbližší celé číslo a v polovině případů zaokrouhluje od nuly | |
poblížint | vrátí nejbližší celé číslo pomocí aktuálního režimu zaokrouhlování | |
rint lrint llrint | vrátí nejbližší celé číslo pomocí aktuálního režimu zaokrouhlování s výjimkou, pokud se výsledek liší | |
Plovoucí- směřovat manipulace funkce | frexp | rozloží číslo na mantinel a mocninu 2 |
ldexp | vynásobí číslo o 2 povýšené na mocninu | |
modf | rozloží číslo na celé a zlomkové části | |
scalbn scalbln | vynásobí číslo pomocí FLT_RADIX zvýšeného na mocninu | |
další další | vrací další reprezentovatelnou hodnotu s plovoucí desetinnou čárkou směrem k dané hodnotě | |
copysign | zkopíruje znaménko hodnoty s plovoucí desetinnou čárkou | |
Klasifikace | fpclassify | kategorizuje danou hodnotu s plovoucí desetinnou čárkou |
je konečný | zkontroluje, zda dané číslo má konečnou hodnotu | |
isinf | zkontroluje, zda je dané číslo nekonečné | |
Isnan | zkontroluje, zda je dané číslo NaN | |
je normální | zkontroluje, zda je dané číslo normální | |
signbit | zkontroluje, zda je dané číslo záporné |
Prostředí s plovoucí desetinnou čárkou
C99 přidává několik funkcí a typů pro jemnou kontrolu prostředí s plovoucí desetinnou čárkou.[3] Tyto funkce lze použít k ovládání různých nastavení, která ovlivňují výpočty s plovoucí desetinnou čárkou, například režim zaokrouhlování, za jakých podmínek se vyskytnou výjimky, když jsou čísla vyprázdněna na nulu atd. Jsou definovány funkce a typy prostředí s plovoucí desetinnou čárkou v <fenv.h>
záhlaví (<cfenv>
v C ++ ).
Funkce | Popis |
---|---|
feclearexcept | vymaže výjimky (C99 ) |
fegetenv | ukládá aktuální prostředí s plovoucí desetinnou čárkou (C99 ) |
fegetexceptflag | ukládá příznaky aktuálního stavu (C99 ) |
fegetround | načte aktuální směr zaokrouhlování (C99 ) |
feholdexcept | uloží aktuální prostředí s plovoucí desetinnou čárkou a vymaže všechny výjimky (C99 ) |
feraiseexcept | vyvolá výjimku s plovoucí desetinnou čárkou (C99 ) |
fesetenv | nastaví aktuální prostředí s plovoucí desetinnou čárkou (C99 ) |
fesetexceptflag | nastavuje aktuální stavové příznaky (C99 ) |
fesetround | nastaví aktuální směr zaokrouhlování (C99 ) |
fetestexcept | testuje, zda byly vyvolány určité výjimky (C99 ) |
feupdateenv | obnovuje prostředí s plovoucí desetinnou čárkou, ale zachovává aktuální výjimky (C99 ) |
Složitá čísla
C99 přidává nový _Komplex
klíčové slovo (a komplex
makro), které poskytuje podporu pro komplexní čísla. Libovolný typ s plovoucí desetinnou čárkou lze upravit pomocí komplex
, a poté je definována jako dvojice čísel s plovoucí desetinnou čárkou. Všimněte si, že C99 a C ++ neimplementují komplexní čísla způsobem kompatibilním s kódem - druhý místo toho poskytuje třídu std::komplex
.
Všechny operace se složitými čísly jsou definovány v <complex.h>
záhlaví. Stejně jako u funkcí se skutečnou hodnotou, an F
nebo l
přípona označuje plovoucí komplex
nebo dlouhý dvojitý komplex
varianta funkce.
Funkce | Popis | |
---|---|---|
Základní operace | taxíky | počítá absolutní hodnota (C99 ) |
carg | počítá argument komplexního čísla (C99 ) | |
cimag | počítá imaginární část komplexního čísla (C99 ) | |
kvílení | počítá skutečná část komplexního čísla (C99 ) | |
počítá komplexní konjugát (C99 ) | ||
cproj | počítá komplexní projekci do Riemannova koule (C99 ) | |
Umocňování operace | cexp | počítá složitě exponenciální (C99 ) |
dřevák | počítá složitě logaritmus (C99 ) | |
csqrt | počítá složitě odmocnina (C99 ) | |
cpow | počítá složitě Napájení (C99 ) | |
Trigonometrický operace | csin | počítá složitě sinus (C99 ) |
ccos | počítá složitě kosinus (C99 ) | |
ctan | počítá složitě tečna (C99 ) | |
kasino | počítá složitě oblouk sine (C99 ) | |
kakao | počítá složitě kosmický oblouk (C99 ) | |
Catan | počítá složitě tečna oblouku (C99 ) | |
Hyperbolický operace | csinh | počítá složitě hyperbolický sinus (C99 ) |
ccosh | počítá složitě hyperbolický kosinus (C99 ) | |
ctanh | počítá složitě hyperbolická tečna (C99 ) | |
kasino | počítá složitě hyperbolický oblouk sine (C99 ) | |
kakao | počítá složitě hyperbolický oblouk kosinus (C99 ) | |
Catanh | počítá složitě tečna hyperbolického oblouku (C99 ) |
Několik složitějších funkcí je „vyhrazeno pro budoucí použití v C99“.[5] Implementace jsou poskytovány open-source projekty, které nejsou součástí standardní knihovny.
Funkce | Popis | |
---|---|---|
Chybové funkce | cerf | počítá komplex chybová funkce (C99 ) |
cerfc | počítá komplexní komplementární chybová funkce (C99 ) |
Typové obecné funkce
Záhlaví <tgmath.h>
definuje generické makro typu pro každou matematickou funkci definovanou v <math.h>
a <complex.h>
. To přidává omezenou podporu pro přetížení funkce matematických funkcí: stejný název funkce lze použít s různými typy parametrů; skutečná funkce bude vybrána v době kompilace podle typů parametrů.
Každé generické makro typu, které odpovídá funkci definované pro reálná i komplexní čísla, obsahuje celkem 6 různých funkcí: plovák
, dvojnásobek
a dlouhý dvojitý
, a jejich komplex
varianty. Typová obecná makra, která odpovídají funkci definované pouze pro reálná čísla, zapouzdřují celkem 3 různé funkce: plovák
, dvojnásobek
a dlouhý dvojitý
varianty funkce.
Jazyk C ++ zahrnuje nativní podporu pro přetížení funkcí a proto neposkytuje <tgmath.h>
záhlaví i jako funkce kompatibility.
Generování náhodných čísel
Záhlaví <stdlib.h>
(<cstdlib>
v C ++) definuje několik funkcí, které lze použít pro statisticky generování náhodných čísel.[6]
Funkce | Popis |
---|---|
rand | generuje pseudonáhodné číslo mezi 0 a RAND_MAX , včetně. |
sranda | inicializuje a generátor pseudonáhodných čísel |
arc4random | generuje pseudonáhodné číslo mezi 0 a UINT32_MAX , obvykle s použitím lepšího algoritmu než rand |
arc4random_uniform | generuje pseudonáhodné číslo mezi 0 a maximální hodnotou. |
arc4random_buf | naplňte vyrovnávací paměť pseudonáhodným bitovým tokem. |
arc4random_stir | inicializuje a generátor pseudonáhodných čísel. |
The arc4random
rodina funkcí náhodných čísel není definována ve standardu POSIX, ale nachází se v některých běžných libc
implementace. Označoval generátor klíčového proudu uniklé verze RC4 šifra (tedy „Apodřízený RC4"), ale jiné algoritmy, obvykle od jiných šifer jako ChaCha20, byly implementovány od používání stejného jména.
Kvalita náhodnosti z rand
jsou obvykle příliš slabé na to, aby je bylo možné považovat za statisticky náhodné, a vyžaduje to výslovné očkování. Obvykle se doporučuje použít arc4random
namísto rand
Pokud to bude možné. Některé C knihovny implementovat rand
použitím arc4random_uniform
vnitřně.
Implementace
Pod POSIX systémy jako Linux a BSD, matematické funkce (deklarované v <math.h>
) jsou v matematické knihovně seskupeny samostatně libm
. Pokud se tedy použije některá z těchto funkcí, musí být linkeru dána směrnice -lm
. Existují různé libm
implementace, včetně:
- GNU libc je libm
- AMD je libm
- červená čepice je libm
- slunce je FDLIBM, který byl použit jako základ pro FreeBSD je msun a OpenBSD je libm, z nichž oba byly základem Julie je OpenLibm
- musl je libm, založený na BSD libms a dalších projektech jako ARM
- Projekt Arénaire CRlibm (správně zaoblené libm) a jeho nástupce MetaLibm. Použití Remezův algoritmus automaticky generovat aproximace, které jsou formálně prokázány.
Implementace nemusí být nutně pod názvem libm
zahrnout:
- PAŽE je optimalizované matematické rutiny
- GCE-matematika je verze matematických funkcí C / C ++ psaná pro C ++
constexpr
(výpočet v době kompilace) - SIMD (vektorizované) matematické knihovny zahrnují RUKÁV, Jo!, a Agner Fog VCL plus několik uzavřených zdrojů jako SVML a DirectXMath.[7]
Viz také
Reference
- ^ A b Specifikace ISO / IEC 9899: 1999 (PDF). p. 212, § 7.12.
- ^ Prata, Stephen (2004). C primer plus. Sams Publishing. Dodatek B, část V: Standardní knihovna ANSI C s dodatky C99. ISBN 0-672-32696-5.
- ^ A b Prata, Stephen (2004). C primer plus. Sams Publishing. Dodatek B, část VIII: Číselná vylepšení C99. ISBN 0-672-32696-5.
- ^ Notačně se může zdát vhodné použít pow (X, 2) nebo prášek (X, 3) k výpočtu čtverců nebo kostek. V časově kritickém kódu to však není vhodné. Pokud se implementace nestará o tyto případy v době kompilace, X*X nebo X*X*X se spustí mnohem rychleji. Také sqrt (X) a cbrt (X) by měl být upřednostňován před práškem (X, 0,5) nebo prášek (X,1./3).
- ^ man cerf (3), man cerfc (3), viz např. https://linux.die.net/man/3/cerf.
- ^ „Knihovna GNU C - náhodné ISO“. Citováno 18. července 2018.
- ^ Cordes, Peter. „intel - Kde je Clangova„ _mm256_pow_ps “vnitřní?“. Přetečení zásobníku.
externí odkazy
- Specifikace Single UNIX, Vydání 7 od Otevřená skupina : matematické deklarace - referenční definice základen,
- C reference pro matematické funkce