Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [c/c++] Tan

    Salve,
    cosa succede esattamente quando viene passato pi/2 alla funzione tan()?

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Otterrai NaN, dato che tan(pi/2) è +infinito.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    si lo pensavo anche io...ma ho appena scoperto che restituisce il massimo numero rappresentabile su quel computer.

    Ed effettivamente è giusto, chissà quanti bug si creerebbero se ogni volta che ti avvicini a pi/2 ti desse un NaN!

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Che valore hai usato per pi?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  5. #5
    Originariamente inviato da Ippo343
    Otterrai NaN, dato che tan(pi/2) è +infinito.
    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.
    Esempio rapido:
    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;
    }
    Output:
    codice:
    1.63312e+16
    -1.63312e+16
    -nan
    -inf
    nan
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Speravo che entrassi tu nella discussione

    Grazie!
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  7. #7
    Non c'è di che; ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.