Funzioni Matematiche della Libreria Standard in Linguaggio C

Concetti Chiave
  • La libreria matematica standard C, definita nell'header <math.h>, offre una vasta gamma di funzioni matematiche per eseguire operazioni comuni come calcoli trigonometrici, esponenziali, logaritmici e altro ancora.
  • La libreria include costanti numeriche utili come M_PI per il valore di \pi e M_E per il valore di e.
  • Le funzioni matematiche sono disponibili in tre varianti per supportare i tipi di dati float, double e long double, consentendo una maggiore flessibilità nell'uso delle precisioni numeriche.

Costanti numeriche

La libreria matematica standard C definisce alcune costanti numeriche utili per le operazioni matematiche. Queste costanti sono definite come macro nell'header <math.h> e includono:

Macro Valore approssimato Descrizione
M_PI 3.14159265358979323846 Valore di \pi
M_PI_2 1.57079632679489661923 Valore di \frac{\pi}{2}
M_PI_4 0.78539816339744830962 Valore di \frac{\pi}{4}
M_1_PI 0.31830988618379067154 Valore di \frac{1}{\pi}
M_2_PI 0.63661977236758134308 Valore di \frac{2}{\pi}
M_2_SQRTPI 1.12837916709551257390 Valore di \frac{2}{\sqrt{\pi}}
M_E 2.71828182845904523536 Valore di e (base dei logaritmi naturali)
M_SQRT2 1.41421356237309504880 Valore di \sqrt{2}
M_SQRT1_2 0.70710678118654752440 Valore di \frac{1}{\sqrt{2}}
M_LN2 0.69314718055994530942 Valore di \ln(2)
M_LN10 2.30258509299404568402 Valore di \ln(10)
M_LOG2E 1.44269504088896340736 Valore di \log_2(e)
M_LOG10E 0.43429448190325182765 Valore di \log_{10}(e)
Tabella 1: Tabella delle costanti matematiche definite nella libreria standard C

In realtà, tali macro non sono parte dello standard C, ma sono ampiamente supportate dai compilatori più comuni come estensioni. Tuttavia, è importante notare che non tutti i compilatori garantiscono la presenza di queste macro, quindi è buona pratica verificare la documentazione del compilatore in uso.

Funzioni Trigonometriche

La libreria matematica standard C fornisce diverse funzioni trigonometriche per calcolare i valori delle funzioni seno, coseno, tangente e le loro inverse:

Funzione Descrizione Note
sinf(float x) \sin(x) in radianti. Restituisce float. C99
sin(double x) \sin(x) in radianti. Restituisce double.
sinl(long double x) \sin(x) in radianti. Restituisce long double. C99
cosf(float x) \cos(x) in radianti. Restituisce float. C99
cos(double x) \cos(x) in radianti. Restituisce double.
cosl(long double x) \cos(x) in radianti. Restituisce long double. C99
tanf(float x) \tan(x) in radianti. Restituisce float. C99
tan(double x) \tan(x) in radianti. Restituisce double.
tanl(long double x) \tan(x) in radianti. Restituisce long double. C99
Tabella 2: Funzioni trigonometriche della libreria standard C
Funzione Descrizione Note
asinf(float x) \arcsin(x) in radianti. Restituisce float. C99
asin(double x) \arcsin(x) in radianti. Restituisce double.
asinl(long double x) \arcsin(x) in radianti. Restituisce long double. C99
acosf(float x) \arccos(x) in radianti. Restituisce float. C99
acos(double x) \arccos(x) in radianti. Restituisce double.
acosl(long double x) \arccos(x) in radianti. Restituisce long double. C99
atanf(float x) \arctan(x) in radianti. Restituisce float. C99
atan(double x) \arctan(x) in radianti. Restituisce double.
atanl(long double x) \arctan(x) in radianti. Restituisce long double. C99
atan2f(float y, float x) \arctan\left(\frac{y}{x}\right) in radianti. Restituisce float. C99
atan2(double y, double x) \arctan\left(\frac{y}{x}\right) in radianti. Restituisce double.
atan2l(long double y, long double x) \arctan\left(\frac{y}{x}\right) in radianti. Restituisce long double. C99
Tabella 3: Funzioni trigonometriche inverse della libreria standard C

Un'importante osservazione riguarda l'unità di misura degli angoli utilizzata da queste funzioni. Tutte le funzioni trigonometriche della libreria matematica standard C operano in radianti, non in gradi. Pertanto, se si desidera utilizzare gradi, è necessario convertire i valori tra gradi e radianti utilizzando le seguenti formule:

  • \text{radianti} = \text{gradi} \times \frac{\pi}{180}
  • \text{gradi} = \text{radianti} \times \frac{180}{\pi}

Inoltre, spesso a causa di arrotondamenti numerici, non è detto che il risultato fornito dalla funzione cos, ad esempio, passato in ingresso alla funzione acos restituisca esattamente il valore originale.

Inoltre, la funzione acos restituisce valori solo nell'intervallo [0, \pi], mentre asin e atan restituiscono valori nell'intervallo [-\frac{\pi}{2}, \frac{\pi}{2}].

La funzione atan2 è particolarmente utile perché considera il segno di entrambi gli argomenti per determinare il quadrante corretto dell'angolo risultante, restituendo valori nell'intervallo (-\pi, \pi]. Una chiamata ad atan(x) equivale a atan2(x, 1.0).

Funzioni Iperboliche

La libreria matematica standard C include anche funzioni per calcolare le funzioni iperboliche e le loro inverse:

Funzione Descrizione Note
sinhf(float x) \sinh(x) Restituisce float. C99
sinh(double x) \sinh(x) Restituisce double.
sinhl(long double x) \sinh(x) Restituisce long double. C99
coshf(float x) \cosh(x) Restituisce float. C99
cosh(double x) \cosh(x) Restituisce double.
coshl(long double x) \cosh(x) Restituisce long double. C99
tanhf(float x) \tanh(x) Restituisce float. C99
tanh(double x) \tanh(x) Restituisce double.
tanhl(long double x) \tanh(x) Restituisce long double. C99
Tabella 4: Funzioni iperboliche della libreria standard C
Funzione Descrizione Note
asinhf(float x) \operatorname{arcsinh}(x) Restituisce float. C99
asinh(double x) \operatorname{arcsinh}(x) Restituisce double. C99
asinhl(long double x) \operatorname{arcsinh}(x) Restituisce long double. C99
acoshf(float x) \operatorname{arccosh}(x) Restituisce float. C99
acosh(double x) \operatorname{arccosh}(x) Restituisce double. C99
acoshl(long double x) \operatorname{arccosh}(x) Restituisce long double. C99
atanhf(float x) \operatorname{arctanh}(x) Restituisce float. C99
atanh(double x) \operatorname{arctanh}(x) Restituisce double. C99
atanhl(long double x) \operatorname{arctanh}(x) Restituisce long double. C99
Tabella 5: Funzioni iperboliche inverse della libreria standard C

Si noti che anche in questo caso, le funzioni iperboliche operano su valori in radianti e non in gradi.

Funzioni Esponenziali e Logaritmiche

La libreria matematica standard C fornisce funzioni per calcolare esponenziali e logaritmi:

Funzione Descrizione Note
expf(float x) e^x Restituisce float. C99
exp(double x) e^x Restituisce double.
expl(long double x) e^x Restituisce long double. C99
logf(float x) \ln(x) Restituisce float. C99
log(double x) \ln(x) Restituisce double.
logl(long double x) \ln(x) Restituisce long double. C99
log10f(float x) \log_{10}(x) Restituisce float. C99
log10(double x) \log_{10}(x) Restituisce double.
log10l(long double x) \log_{10}(x) Restituisce long double. C99
exp2f(float x) 2^x Restituisce float. C99
exp2(double x) 2^x Restituisce double. C99
exp2l(long double x) 2^x Restituisce long double. C99
expm1f(float x) e^x - 1 Restituisce float. C99
expm1(double x) e^x - 1 Restituisce double. C99
expm1l(long double x) e^x - 1 Restituisce long double. C99
log1pf(float x) \ln(1 + x) Restituisce float. C99
log1p(double x) \ln(1 + x) Restituisce double. C99
log1pl(long double x) \ln(1 + x) Restituisce long double. C99
log2f(float x) \log_2(x) Restituisce float. C99
log2(double x) \log_2(x) Restituisce double. C99
log2l(long double x) \log_2(x) Restituisce long double. C99
ilogbf(float x) Parte intera di \log_2(x). Restituisce int. C99
ilogb(double x) Parte intera di \log_2(x). Restituisce int. C99
ilogbl(long double x) Parte intera di \log_2(x). Restituisce int. C99
logbf(float x) Esponente di x in base 2. Restituisce int. C99
logb(double x) Esponente di x in base 2. Restituisce int. C99
logbl(long double x) Esponente di x in base 2. Restituisce int. C99
Tabella 6: Funzioni esponenziali e logaritmiche della libreria standard C

Tutte queste funzioni hanno a che fare con l'esponenziale naturale (base e) o con il logaritmo naturale, tranne quelle specificamente indicate come logaritmi in base 10 o in base 2.

Inoltre, calcolare il logaritmo di numeri molto vicini a 1 può portare a errori di arrotondamento significativi. Per questo motivo, le funzioni log1p e expm1 sono state introdotte per fornire una maggiore precisione in questi casi specifici.

Per calcolare il logaritmo in basi diverse da e, 10 o 2, è possibile utilizzare la formula di cambio di base:

\log_b(x) = \frac{\log_k(x)}{\log_k(b)}

Quindi, ad esempio, per calcolare il logaritmo in base 3 di un numero x, si può utilizzare:

double log_base_3(double x) {
    return log(x) / log(3.0);
}

Funzioni di Potenza e Radice

La libreria matematica standard C include funzioni per calcolare potenze e radici:

Funzione Descrizione Note
powf(float b, float e) Calcola b^e. Restituisce float. C99
pow(double b, double e) Calcola b^e. Restituisce double.
powl(long double b, long double e) Calcola b^e. Restituisce long double. C99
sqrtf(float x) Calcola \sqrt{x}. Restituisce float. C99
sqrt(double x) Calcola \sqrt{x}. Restituisce double.
sqrtl(long double x) Calcola \sqrt{x}. Restituisce long double. C99
frexpf(float x, int *esponente) Scompone x in frazione e potenza di 2. Restituisce float. C99
frexp(double x, int *esponente) Scompone x in frazione e potenza di 2. Restituisce double.
frexpl(long double x, int *esponente) Scompone x in frazione e potenza di 2. Restituisce long double. C99
ldexpf(float f, int e) Calcola f \times 2^e. Restituisce float. C99
ldexp(double f, int e) Calcola f \times 2^e. Restituisce double.
ldexpl(long double f, int e) Calcola f \times 2^e. Restituisce long double. C99
cbrtf(float x) Calcola \sqrt[3]{x}. Restituisce float. C99
cbrt(double x) Calcola \sqrt[3]{x}. Restituisce double. C99
cbrtl(long double x) Calcola \sqrt[3]{x}. Restituisce long double. C99
hypotf(float x, float y) Calcola \sqrt{x^2 + y^2}. Restituisce float. C99
hypot(double x, double y) Calcola \sqrt{x^2 + y^2}. Restituisce double.
hypotl(long double x, long double y) Calcola \sqrt{x^2 + y^2}. Restituisce long double. C99
Tabella 7: Funzioni di potenza e radice della libreria standard C

Funzioni di Arrotondamento e Resto

La libreria matematica standard C fornisce funzioni per l'arrotondamento e il calcolo del resto:

Funzione Descrizione Note
ceilf(float x) Arrotonda x per eccesso. Restituisce float. C99
ceil(double x) Arrotonda x per eccesso. Restituisce double.
ceill(long double x) Arrotonda x per eccesso. Restituisce long double. C99
floorf(float x) Arrotonda x per difetto. Restituisce float. C99
floor(double x) Arrotonda x per difetto. Restituisce double.
floorl(long double x) Arrotonda x per difetto. Restituisce long double. C99
fmodf(float x, float y) Calcola il resto di x / y. Restituisce float. C99
fmod(double x, double y) Calcola il resto di x / y. Restituisce double.
fmodl(long double x, long double y) Calcola il resto di x / y. Restituisce long double. C99
truncf(float x) Tronca x alla parte intera. Restituisce float. C99
trunc(double x) Tronca x alla parte intera. Restituisce double.
truncl(long double x) Tronca x alla parte intera. Restituisce long double. C99
roundf(float x) Arrotonda x al più vicino intero. Restituisce float. C99
round(double x) Arrotonda x al più vicino intero. Restituisce double.
roundl(long double x) Arrotonda x al più vicino intero. Restituisce long double. C99
lrintf(float x) Arrotonda x al più vicino intero e restituisce long int. C99
lrint(double x) Arrotonda x al più vicino intero e restituisce long int.
lrintl(long double x) Arrotonda x al più vicino intero e restituisce long int. C99
lroundf(float x) Arrotonda x al più vicino intero e restituisce long int. C99
lround(double x) Arrotonda x al più vicino intero e restituisce long int.
lroundl(long double x) Arrotonda x al più vicino intero e restituisce long int. C99
Tabella 8: Funzioni di arrotondamento e resto della libreria standard C

Queste funzioni sono utili per gestire operazioni di arrotondamento e calcolo del resto in modo preciso e controllato.

Funzioni Gamma e Errore

La libreria matematica standard C include funzioni per calcolare la funzione gamma e la funzione di errore:

Funzione Descrizione Note
tgammaf(float x) Calcola la funzione gamma di x. Rest
ituisce float. C99
tgamma(double x) Calcola la funzione gamma di x. Restituisce double.
tgammal(long double x) Calcola la funzione gamma di x. Restituisce long double. C99
lgammaf(float x) Calcola il logaritmo naturale della funzione gamma di x. Restituisce float. C99
lgamma(double x) Calcola il logaritmo naturale della funzione gamma di x. Restituisce double.
lgammal(long double x) Calcola il logaritmo naturale della funzione gamma di x. Restituisce long double. C99
erff(float x) Calcola la funzione di errore di x. Restituisce float. C99
erf(double x) Calcola la funzione di errore di x. Restituisce double.
erfl(long double x) Calcola la funzione di errore di x. Restituisce long double. C99
erfcf(float x) Calcola la funzione di errore complementare di x. Restituisce float. C99
erfc(double x) Calcola la funzione di errore complementare di x. Restituisce double.
erfcl(long double x) Calcola la funzione di errore complementare di x. Restituisce long double. C99
lgamma_r(double x, int *signgamp) Calcola il logaritmo naturale della funzione gamma di x e imposta il segno in signgamp. Restituisce double. C99
Tabella 9: Funzioni gamma e di errore della libreria standard C

Alcune osservazioni importanti riguardo a queste funzioni:

  • Le funzioni erf, erff e erfl calcolano la funzione di errore, che è utile in statistica e probabilità:

    \operatorname{erf}(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} dt
  • Le funzioni erfc, erccf e erfcl calcolano la funzione di errore complementare:

    \operatorname{erfc}(x) = 1 - \operatorname{erf}(x)
  • La funzione gamma, \Gamma(x), è una generalizzazione della funzione fattoriale per numeri reali e complessi. Per numeri interi positivi vale:

    \Gamma(n) = (n-1)!

    Per valori reali e complessi, la funzione gamma è più complessa e viene definita tramite un'integrale improprio:

    \Gamma(x) = \int_0^{\infty} t^{x-1} e^{-t} dt

    Le funzioni tgamma e lgamma calcolano rispettivamente la funzione gamma e il suo logaritmo naturale:

    • tgamma(x) restituisce \Gamma(x)
    • lgamma(x) restituisce \ln(|\Gamma(x)|)

    La funzione lgamma_r fornisce anche il segno della funzione gamma tramite il parametro signgamp. Spesso usare la funzione logaritmica è preferibile per evitare problemi di overflow con valori grandi di x.