19. Funzioni matematiche

La libreria math.h include numerose funzioni matematiche che possono tornare utili per la risoluzione di numerosi problemi. Sono incluse sia funzioni specializzate ad operare con numeri in virgola mobile (double e float) sia funzioni che operano su valori numerici di tipo intero (int e long).

In base alle esigenze occorre scegliere la funzione più idonea per le proprie esigenze.

Si tenga conto che le funzioni di tipo double operano su valori numerici con parte decimale ed anche il risultato è dello stesso tipo. Poiché il cast di un numero in virgola mobile (double o float che sia) in intero effettua un troncamento e non un arrotondamento, l'uso incauto di funzioni di questo tipo può produrre risultati inattesi.


Esempio

In questo esempio, operando su numeri in virgola mobile, si utilizzeranno le funzioni sqrt() e pow() per il calcolo della diagonale di un rettangolo.


#include <stdio.h>

#include <math.h>

int main()

{

float b, h, d;


printf("Inserire le misure della base e dell'altezza di un rettangolo in cm. (numeri decimali): ");

scanf("%f %f", &b, &h);


d=sqrt(pow(b, 2) + pow(h, 2));


printf("la misura della diagonale del rettangolo e' di %.2f cm", d);

return 0;

}


La potenza

Nel seguente esempio si utilizza la funzione pow() per calcolare la potenza di un intero, su un computer con Windows, ottenendo un risultato impreciso.


#include <stdio.h>

#include <math.h>

int main()

{

int i, n;

for(i=0; i<6;i++){

n=pow(10, i);

printf("%d\n", n);

}

return 0;

}

Esecuzione:


1

10

99

1000

9999

100000

Per ovviare a ciò e ottenere un arrotondamento corretto, ,sempre utilizzando la funzione pow(), si può procedere nel seguente modo:


#include <stdio.h>

#include <math.h>

int main()

{

int i, n;

for(i=0; i<6;i++){

n=pow(10, i)+0.5;

printf("%d\n", n);

}

return 0;

}

Esecuzione:

1

10

100

1000

10000

100000


La soluzione più corretta è quella di utilizzare la funzione powl() che opera su valori numerici di tipo long.

#include <stdio.h>

#include <math.h>

int main()

{

int i, n;

for(i=0; i<6;i++){

n=powl(10, i);

printf("%d\n", n);

}

return 0;

}

Esecuzione:

1

10

100

1000

10000

100000