Pagina 1 di 1

programmazione...pow in c++

Inviato: gio 8 nov 2007, 18:49
da ccts2002
ciao a tutti!!!
dopo che per tutto il pomeriggio sono divento scemo per capire come mai un programma in c++ non dava i risultati sperati, sono arrivato alla seguente conclusione:
per il compilatore g++ se uno scrive:

Codice: Seleziona tutto

double a=43423;
printf("%lf",pow(a,(1/3)));
ritorna 1 :shock: :shock:
quindi approssima 1/3 a 0...ma perché?
qualcuno ha già avuto questo problema? e se si come lo ha risolto?

P.S.: il problema si ripropone anche se assegno ad una variabile temporanea

Codice: Seleziona tutto

b=1/3;
e la uso come esponente...
ma non se uso il numero in se...0.3333

Inviato: gio 8 nov 2007, 19:11
da gallows
Perché 1/3, senza specificare un cast, è un int, ergo 0. pow(n, 0) dà sempre 1.
Il codice corretto è:

Codice: Seleziona tutto

    std::cout << std::pow(a, (double) 1/3) << '\n';     
Ps. non è un problema, è un comportamento ereditato dallo standard C

Inviato: gio 8 nov 2007, 23:13
da ccts2002
GRAZIE!!!
io pensavo il viceversa...che 1/3 senza cast fosse un float, o double, mentre per avere l'int bisognasse usare il cast...
grazie ancora!!!

Inviato: ven 9 nov 2007, 9:28
da People
Premesso che non lo posso provare ora ma che vado a memoria, dovrebbe funzionare lo stesso se scrivi

Codice: Seleziona tutto

b=1/3.0;
Così il divisore dovrebbe essere interpretato come costante di tipo float e sul dividendo, di conseguenza, dovrebbe venite eseguito un cast implicito.
Attendo smentite.
Ciao

Inviato: ven 9 nov 2007, 13:49
da gallows
@People: sì, anche quel modo è giusto.

Inviato: ven 9 nov 2007, 15:08
da People
<OT>
@Gallows: bentornato... era un po che nn ti facevi vedere/sentire qui su slacky...
</OT>

Inviato: sab 10 nov 2007, 0:53
da gallows
Grazie :)

ps. Piccolissima precisazione (che cambia poco comunque): 3.0 non è float, è double. Provare per credere:

Codice: Seleziona tutto

std::cout << typeid(3.0).name() << '\n';