Il linguaggio C conosce poche operazioni aritmetiche. Per estendere la sua potenza, nel campo matematico, è necessario utilizzare le funzioni esterne. Grazie ad esse il programmatore può disporre di tante possibilità per arrivare a svolgere complessi calcoli in maniera molto semplice. Vediamo le più importanti e scopriamo come crearne da noi.
Il linguaggio C base non conosce molto la matematica
La modularità del linguaggio C lo rende estremamente potente, specialmente quando si deve creare dal nulla qualcosa che non c'è. Il C base mette a disposizione del programmatore pochissimi operatori aritmetici. A meno che il programma non abbia grosse esigenze di calcolo, nella maggior parte dei casi essi sono più che sufficienti. Diciamo che tutto ciò che sa fare il C puro sono le quattro operazioni più qualche altra funzione di calcolo. Il seguente esempio sfrutta gli operatori base per eseguire la seguente espressione:
r=a+b*c
Per nostra fortuna il linguaggio conosce la priorità degli operatori aritmetici e sa, quindi che le moltiplicazioni devono essere calcolate prima delle addizioni, come ci hanno insegnato alle scuole medie.
#include <stdio.h> int main() { int a,b,c,r; a=12; b=7; c=11; r=a+b*c; printf("Il risultato e' %d\n",r); return 0; }
Compilando ed eseguendo il programma si otterrà, a video, il risultato di 89. I calcoli sono eseguiti a grandissima velocità, specialmente per i valori che riescono ad entrare interamente nei registri della CPU. Se, però, il software ha necessità più grosse e deve spingere le proprie elaborazioni in un campo più squisitamente matematico e logico, occorre intraprendere altre strade. A tale fine, il programmatore ha due soluzioni diverse:
- Creare e scrivere da sé le funzioni UDF per risolvere qualsiasi esigenza elaborativa, come abbiamo visto in una precedente lezione del corso;
- Utilizzare funzioni esterne, già preconfezionate e estremamente testate e sicure.
Ovviamente non c'è un metodo migliore di un altro. Se occorre elaborare risultati aritmetici di normale amministrazione, si possono usare le funzioni matematiche di libreria esterna, senza perdere prezioso tempo nella loro ricodificazione. Se, invece, il problema riguarda complicate procedure per cui non esistono soluzioni già pronte, allora è necessario creare nuove funzioni personalizzate. Se poi le esigenze spingono il programmatore a superare le barriere della CPU ed usare valori numerici dalle dimensioni enormi, allora si possono utilizzare le librerie GMP come abbiamo studiato in un precedente articolo a riguardo e di cui abbiamo preparato anche alcuni sostanziali esempi.
La libreria Math
E' la libreria standard per eccellenza del linguaggio C che contiene funzioni matematiche di vario tipo. Il programmatore, per capire a fondo di cosa si tratta, dovrebbe dare un'occhiata al relativo file di inclusione "math.h". Esso si trova nella cartella /usr/include.
Tale file, da richiamare nei propri listati sorgenti, contiene le macro, le costanti e le dichiarazioni di funzioni (prototipi). Nel file sono elencate, come detto prima, alcune utili costanti che il programmatore può utilizzare senza il bisogno di ridefinirle nuovamente:
#define M_E 2.7182818284590452354 #define M_LOG2E 1.4426950408889634074 #define M_LOG10E 0.43429448190325182765 #define M_LN2 0.69314718055994530942 #define M_LN10 2.30258509299404568402 #define M_PI 3.14159265358979323846 #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.78539816339744830962 #define M_1_PI 0.31830988618379067154 #define M_2_PI 0.63661977236758134308 #define M_2_SQRTPI 1.12837916709551257390 #define M_SQRT2 1.41421356237309504880 #define M_SQRT1_2 0.70710678118654752440
Nell'esempio che segue viene svolto il calcolo dell'area che, come sanno tutti, si determina con la formula raggio x raggio x 3.14. La costante Pi-greco è già memorizzata o meglio, predefinita nel file di inclusione, con il nome di M_PI (in maiuscolo) e contiene 20 cifre decimali. La sua reale espansione è infinita, in quanto il Pi-greco è un numero irrazionale. Pertanto è sufficiente specificarla semplicemente nei calcoli senza riportare esplicitamente il valore di 3.14.
#include <math.h> #include <stdio.h> int main() { float raggio,area; raggio=26.54; area=raggio*raggio*M_PI; printf("L'area del cerchio e' %f\n",area); return 0; }
L'esecuzione del programma produce a video il messaggio: "L'area del cerchio e' 2212.848877".
Primo esempio: elevamento a potenza
Il linguaggio C non dispone di una funzione nativa per elevare un numero a potenza. Si potrebbe realizzare facilmente con una UDF, ma in tal caso essa sarebbe idonea al trattamento dei soli numeri interi. Quello di sotto è un listato che non fa uso delle librerie matematiche ma di una funzione utente che moltiplica, tante volte, un numero. E' interessante notare che il prodotto, nell'ambito della funzione "potenza" è inizializzato ad "uno" per poter poi essere moltiplicato "y" volte per "x". Non utilizzare il listato per grossi valori di potenza.
[...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2406 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Come si è visto, la libreria math.h non è proprio densa di funzioni matematiche. Chi volesse implementare, nei propri listati C, la matematica pura, con numeri di cifre arbitrarie, puo’ usare la libreria GMP che, oltre a gestire numeri enormi composti anche da milioni di cifre, risulta essere estremamente veloce nei calcoli.