Siirry sisältöön

C/Standardikirjastot/math.h

Wikikirjastosta
#include <math.h>

Kaikille funktioiden yhteiset tiedot:

  • C99-standardissa määritellään myös samat funktiot float- ja long double -tyypeille. Ensimmäisen nimen perään lisätään määre f ja jälkimmäisen perään l; esim. sin (double), sinf (float), sinl (long double). Otsikkotiedosto tgmath.h tekee määreettömistä funktioista (esim. sin) geneeriset niin, ettei määrettä tarvitse käyttää, vaan oikea tietotyyppi valitaan automaattisesti. (Muuten määreetön käyttää aina double-tyyppiä, niin kuin ennen C99:ta.)
  • Mikäli annettu arvo on funktion määrittelyalueen ulkopuolella, palautettu arvo on määrittelemätön ja virheen numeroksi (errno, ks. errno.h) asetetaan EDOM. Ks. kuitenkin alempi Virheenkäsittely-osio, mikäli käytössä on C99 tai uudempi standardi.
  • Mikäli funktion tulos on tietotyypin arvoalueen ulkopuolella, palautettu arvo on ±HUGE_VAL, jos arvo on liian kaukana nollasta esitettäväksi, tai 0, jos liian lähellä nollaa esitettäväksi. Lisäksi virheen numeroksi (errno, ks. errno.h) asetetaan ERANGE. Ks. kuitenkin alempi Virheenkäsittely-osio, mikäli käytössä on C99 tai uudempi standardi.

Trigonometriset funktiot

[muokkaa | muokkaa wikitekstiä]
Funktio Selitys
double acos(double x); Arkuskosini. Palauttaa radiaaneina (päähaaran) arvon y niin, että cos(y) = x. Funktion määrittelyalue x:lle on [-1, +1], ja arvoalue on [0, π].
double asin(double x); Arkussini. Palauttaa radiaaneina (päähaaran) arvon y niin, että sin(y) = x. Funktion määrittelyalue x:lle on [-1, +1], ja arvoalue on [-½π, +½π].
double atan(double x); Arkustangentti. Palauttaa radiaaneina (päähaaran) arvon y niin, että tan(y) = x. Funktion määrittelyalue x:lle on [-1, +1], ja arvoalue on [-½π, +½π].
double atan2(double y, double x); Kaksiparametrinen arkustangentti. Jotakuinkin atan(y/x), mutta palauttaa kulman (radiaaneina).

Tällä voidaan muuttaa piste karteesisessa koordinaatistossa kulmaksi napakoordinaatistossa. Arvoalue on [-π, +π]. Virhe, jos y ja x ovat samaan aikaan 0.

double cos(double x); Kosini. Laskee kulman x (radiaaneina) kosinin. Funktion arvoalue on [-1, +1].
double sin(double x); Sini. Laskee kulman x (radiaaneina) sinin. Funktion arvoalue on [-1, +1].
double tan(double x); Tangentti. Laskee kulman x (radiaaneina) tangentin.

Hyperboliset funktiot

[muokkaa | muokkaa wikitekstiä]
Funktio Selitys
double acosh(double x); [C99] Hyperbolinen arkuskosini.
double asinh(double x); [C99] Hyperbolinen arkussini.
double atanh(double x); [C99] Hyperbolinen arkustangentti.
double cosh(double x); Hyperbolinen kosini.
double sinh(double x); Hyperbolinen sini.
double tanh(double x); Hyperbolinen tangentti.

Eksponenttifunktiot

[muokkaa | muokkaa wikitekstiä]
Funktio Selitys
double exp(double x); Eksponenttifunktio. Laskee eksponentin, jonka kantaluku on Neperin luku (e, 2.718...) ja potenssi on x.
double exp2(double x); [C99] 2-kantainen eksponenttifunktio. Laskee eksponentin, jonka kantaluku on 2 ja potenssi on x.
double expm1(double x); [C99] Laskee eksponentin, jonka kantaluku on Neperin luku (e, 2.718...) ja potenssi on x, ja vähentää siitä yhden. Teoriassa yhtä kuin exp(x) - 1, mutta tarkempi.
double frexp(double x, int *eksponentti); Pilkkoo liukuluvun mantissaan, joka on väliltä [½, 1) (mahdollisesti negatiivinen, tai nollan kohdalla nolla), ja kokonaislukueksponenttiin, joka talletetaan osoittimen osoittamaan muistipaikkaan.

Jos funktio palauttaa mantissan m ja eksponentin e, niin x = m × 2e.

Jos x on nolla, niin sekä mantissa että eksponentti ovat 0.

int ilogb(double x); [C99] Palauttaa luvun x logaritmin, jonka kantaluku on float.h:n FLT_RADIX (yleensä 2), kokonaislukuna.
double ldexp(double mantissa, int eksponentti); Koostaa liukuluvun mantissasta ja eksponentista. Jos mantissa on m ja eksponentti e, niin laskee m × 2e. Mantissan määrittelyaluetta ei ole rajattu (edes frexp:n mukaisesti).
double log(double x); Luonnollinen logaritmi. Laskee luvun x luonnollisen logaritmin. Funktion määrittelyalue vaatii, että x on positiivinen.
double log1p(double x); [C99] Laskee luvun x + 1 luonnollisen logaritmin. Teoriassa yhtä kuin log(x + 1), mutta tarkempi.
double log2(double x); [C99] Laskee luvun x logaritmin kantaluvulla 2. Funktion määrittelyalue vaatii, että x on positiivinen.
double logb(double x); [C99] Laskee luvun x logaritmin, jonka kantaluku on float.h:n FLT_RADIX (yleensä 2). Funktion määrittelyalue vaatii, että x on positiivinen.
double log10(double x); 10-kantainen logaritmi. Laskee luvun x logaritmin kantaluvulla 10. Funktion määrittelyalue vaatii, että x on positiivinen.
double modf(double x, double *koko); Pilkkoo liukuluvun kokonaisosaan ja desimaaliosaan. Palauttaa desimaaliosan, kun taas kokonaisosa talletetaan osoittimen osoittamaan muistipaikkaan.

Molempien osien etumerkki on sama kuin luvun x.

double scalbn(double mantissa, int eksponentti); [C99] Koostaa liukuluvun mantissasta ja eksponentista. Jos mantissa on m ja eksponentti e, niin laskee m × be, jossa b on float.h:n FLT_RADIX (yleensä 2). Mantissan määrittelyaluetta ei ole rajattu (edes frexp:n mukaisesti).
double scalbln(double mantissa, long eksponentti); [C99] Koostaa liukuluvun mantissasta ja eksponentista. Jos mantissa on m ja eksponentti e, niin laskee m × be, jossa b on float.h:n FLT_RADIX (yleensä 2). Mantissan määrittelyaluetta ei ole rajattu (edes frexp:n mukaisesti).

Potenssifunktiot

[muokkaa | muokkaa wikitekstiä]
Funktio Selitys
double cbrt(double x); [C99] Kuutiojuuri. Laskee luvun x kuutiojuuren.
double hypot(double x, double y); [C99] Laskee hypotenuusan pituuden, kun kateettien pituudet ovat x ja y. Teoriassa sama kuin sqrt(x * x + y * y), mutta tarkempi.
double pow(double x, double y); Potenssi. Nostaa luvun x y:nteen potenssiin. Jos x on negatiivinen, y:n on oltava kokonaisluku.
double sqrt(double x); Neliöjuuri. Laskee luvun x neliöjuuren. Funktion määrittelyalue vaatii, ettei x ole negatiivinen.

Muut erikoisfunktiot

[muokkaa | muokkaa wikitekstiä]
Funktio Selitys
double erf(double x); [C99] Virhefunktio (ks. Wikipedia).
double erfc(double x); [C99] Virhefunktion komplementti.
double lgamma(double x); [C99] Gammafunktion (itseisarvon luonnollinen) logaritmi.
double tgamma(double x); [C99] Gammafunktio.

Pyöristys ja jakojäännös

[muokkaa | muokkaa wikitekstiä]
Funktio Selitys
double ceil(double x); Pyöristää luvun x ylöspäin kokonaisluvuksi. Jos se on jo kokonaisluku, palauttaa sellaisenaan.
double fabs(double x); Itseisarvo. Palauttaa luvun x itseisarvon.
double floor(double x); Pyöristää luvun x alaspäin kokonaisluvuksi. Jos se on jo kokonaisluku, palauttaa sellaisenaan.
double fmod(double x, double y); Jakojäännös. Palauttaa lukujen x ja y jakojäännöksen. y ei saa olla nolla.

Jos osamäärä x/y pyöristettynä nollaa kohti on q, niin fmod(x, y) = x - qy.

double nearbyint(double x); [C99] Pyöristää luvun x kokonaisluvuksi float.h:n fegetround:n mukaisesti. Ei johda FE_INEXACT (ks. float.h) -poikkeukseen, vaikka tulos ei ole tarkka.
double remainder(double x, double y);

double remquo(double x, double y, int *q);

[C99] Jakojäännös. Palauttaa lukujen x ja y jakojäännöksen. y ei saa olla nolla. Voi antaa eri tuloksen kuin fmod.

Jos osamäärä x/y pyöristettynä lähintä kokonaislukua kohti (puolikkaat kohti parillista kokonaislukua) on q, niin remainder(x, y) = x - qy.

remquo tallettaa lisäksi luvun q annetun osoittimen osoittamaan muistipaikkaan.

double rint(double x);

long lrint(double x);
long long llrint(double x);

[C99] Pyöristää luvun x kokonaisluvuksi float.h:n fegetround:n mukaisesti. Voi johtaa FE_INEXACT (ks. float.h) -poikkeukseen, mikäli tulos ei ole tarkka.
double round(double x);

long lround(double x);
long long llround(double x);

[C99] Pyöristää luvun x kokonaisluvuksi matemaattisin säännöin (lähimpään, puolikkaat poispäin nollasta). Jos se on jo kokonaisluku, palauttaa sellaisenaan.
double trunc(double x); [C99] Pyöristää luvun x nollaa kohti kokonaisluvuksi. Jos se on jo kokonaisluku, palauttaa sellaisenaan.

Muut funktiot

[muokkaa | muokkaa wikitekstiä]
Funktio Selitys
double copysign(double x, double y); [C99] Korvaa luvun x etumerkin luvun y etumerkillä ja palauttaa tuloksena saadun luvun.
double fdim(double x, double y); [C99] Jos x > y, laskee x - y, muuten palauttaa nollan.
double fma(double x, double y, double z); [C99] Laskee x × y + z. Teoriassa yhtä kuin x * y + z, mutta tarkempi.

Määrittelemällä makron FP_FAST_FMA (tai FP_FAST_FMAF, FP_FAST_FMAL) kääntäjä voi ilmaista, että fma ei ole vain tarkempi, mutta myös nopeampi tapa laskea kyseinen lasku.

double fmax(double x, double y); [C99] Palauttaa suuremman luvun, joko x tai y.
double fmin(double x, double y); [C99] Palauttaa pienemmän luvun, joko x tai y.
double nan(const char *nimi); [C99] Palauttaa 'hiljaisen' epäluvun. Jos nimi on tyhjä merkkijono, palauttaa tavallisen epäluvun; muuten riippuu toteutuksesta.
double nextafter(double x, double y);

double nexttoward(double x, long double y);

[C99] Jos x = y, palauttaa y. Jos x < y, palauttaa pienimmän luvun, joka on suurempi kuin x. Jos x > y, palauttaa suurimman luvun, joka on pienempi kuin x.
HUGE_VAL

on suurin arvo, jonka voi tallettaa double-tyyppiseen liukulukumuuttujaan. Funktio voi palauttaa HUGE_VAL tai -HUGE_VAL, mikäli arvo olisi liian suuri esitettäväksi.

C99-standardissa määritellään myös

INFINITY
NAN

eli ääretön ja epäluku; molempien tietotyyppi on float.

Luvun luokittelu

[muokkaa | muokkaa wikitekstiä]

[Lisätty C99-standardissa]

Makro Palautusarvo
fpclassify(x)
  • FP_NORMAL jos x on normaali liukuluku
  • FP_SUBNORMAL jos x on alinormaali liukuluku (eli liian lähellä nollaa esitettäväksi normalisoituna)
  • FP_ZERO jos x on nolla
  • FP_INFINITE jos x on ääretön
  • FP_NAN jos x on epäluku
  • toteutuksesta riippuen mahdollisesti myös muita palautusarvoja
isfinite(x) Jokin muu luku kuin nolla, jos x on äärellinen luku, muuten nolla.
isinf(x) Jokin muu luku kuin nolla, jos x on ääretön, muuten nolla.
isnan(x) Jokin muu luku kuin nolla, jos x on epäluku, muuten nolla.
isnormal(x) Jokin muu luku kuin nolla, jos x on normaali liukuluku, muuten nolla.
signbit(x) Jokin muu luku kuin nolla, jos x on negatiivinen (mukaan lukien liukulukujen negatiivinen nolla), muuten nolla.

Turvallinen vertailu

[muokkaa | muokkaa wikitekstiä]

[Lisätty C99-standardissa]

Nämä makrot eivät koskaan aiheuta liukulukupoikkeuksia (ks. Virheenkäsittely-osio).

Makro Yhtä kuin
isgreater(x, y) x > y
isgreaterequal(x, y) x >= y
isless(x, y) x < y
islessequal(x, y) x <= y
islessgreater(x, y) x < y || x > y
isunordered(x, y)
Palauttaa 1 jos x ja y eivät ole missään järjestyksessä, 0 muuten

Virheenkäsittely

[muokkaa | muokkaa wikitekstiä]

[Lisätty C99-standardissa]