NaN e +Infinity nell'IEEE 754 sono due valori ben distinti. Comunque lo standard non dice nulla di preciso in proposito, dato che consente implementazioni differenti dell'aritmetica in floating point. Tuttavia, dato che di fatto nella stragrande maggioranza dei casi si usa l'IEEE 754 (che supporta +NaN, -Nan, +Infinity, -Inifinity e un mucchio di altri valori speciali), spesso per operazioni non valide si ottengono questo genere di valori. Nota comunque che con tan(pi/2) non otterrai mai +Inf perché non è possibile rappresentare esattamente pi/2, per cui non arrivi mai al caso in cui la tangente diverge.Originariamente inviato da Ippo343
Otterrai NaN, dato che tan(pi/2) è +infinito.
Esempio rapido:
Output:codice:#include <cmath> #include <iostream> using namespace std; int main() { cout<<tan(M_PI_2)<<endl<<tan(-M_PI_2)<<endl<<sqrt(-1)<<endl<<log(0)<<endl<<log(-1)<<endl; return 0; }
I primi due valori sono perché non è esattamente +/- pi/2 ma ci è molto vicino; la radice di -1 non è rappresentabile come numero reale, per cui ottengo un NaN (not a number), negativo suppongo perché ho chiesto la radice di un numero negativo. Il logaritmo di zero tende a -infinito, che in questo caso viene riportato correttamente dato che 0 è rappresentabile esattamente con un double. Infine, il dominio della funzione logaritmo (finché si rimane nei reali) è (0, +∞ ), per cui chiedendo il logaritmo di -1 si ottiene nan. In ogni caso, questi valori sono dettagli implementativi: nello standard C99 (§7.12.1) si spiega che i valori restituiti in casi del genere dipendono dalla particolare implementazione.codice:1.63312e+16 -1.63312e+16 -nan -inf nan