programmazione...pow in c++

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

programmazione...pow in c++

Messaggio 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

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio 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

Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

Messaggio 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!!!

Avatar utente
People
Linux 2.x
Linux 2.x
Messaggi: 216
Iscritto il: mar 22 giu 2004, 0:00
Slackware: 12.1
Kernel: 2.6.
Desktop: KDE

Messaggio 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

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio da gallows »

@People: sì, anche quel modo è giusto.

Avatar utente
People
Linux 2.x
Linux 2.x
Messaggi: 216
Iscritto il: mar 22 giu 2004, 0:00
Slackware: 12.1
Kernel: 2.6.
Desktop: KDE

Messaggio da People »

<OT>
@Gallows: bentornato... era un po che nn ti facevi vedere/sentire qui su slacky...
</OT>

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio 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';

Rispondi