Newsgroup: it.comp.lang.c++
Titolo: Problema con i tipi di variabili e risultati approssimati

 
Se nel seguente codice, dichiaro la variabile i, come tipo *double*:
 
==============================
 
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
   int e=2;
   int r=3;
   double i;
 
 i= r*(pow(10,e));
 
    cout<<i;
 
    return 0;
}
 
=======================
 
ottengo il risultato voluto : i=300
 
 
...ma se per curiosità, dichiaro i come *intero* ottengo 299, cioe' un
risultato approssimato...il problema e' dovuto alle seguente
definizione della funzione pow ?
 
http://www.cplusplus.com/reference/cmath/pow/?kw=pow
 
 
Perche' ottengo, nel secondo caso (con i intero) un risultato errato e
pari a 299 invece di 300?
 
Ciao e grazie mille!
 
 
 
 
 

 definizione della funzione pow ?
Puo' dipendere da molti fattori:
- Dal compilatore che usi.
- Dalla libreria matematica / processore usato (x86/ARM/ppc)
- dalla precisione in stampa di cout
Per impostare la massima precisione, prova a includere il
file limits
#include <limits>
Oppure modificala esplicitamente:
cout.precision(15);
 
BTW: con gcc4.4.2 e FPU ppc non ho trovato problemi (in questo caso).
 
AA.
 


 
A me, con VS2010, d� sempre 300,
per� devo scrivere
i= r*(pow(10.0,e));
altrimenti mi d� "error C2668: 'pow' : ambiguous call to overloaded 
function"
could be 'long double pow(long double,int)'
or       'float pow(float,int)'
or       'double pow(double,int)'
 
Infatti, con il nuovo standard, la versione pow(int,int) � stata 
eliminata, quindi penso che tu stia utilizzando un compilatore non 
standard (anche VS2010 non implementa completamente il nuovo standard, 
ma per altri motivi), oppure hai impostato un livello di warning troppo 
basso.
 
Come gi� detto da CortexA57, dipende da molti fattori.
 
P.S.: invece di scrivere
#include <math.h>
dovresti scrivere
#include <cmath>
 


OK, ti ringrazio...pare funzionare corrrettamente, ho apportato le
seguenti modofiche con i intero:
 
==============================
 
#include <iostream>
#include <cmath>
 
 using namespace std;
 
int main()
 {
    int e=2;
   int r=3;
  int i;
 
 i= r*(pow(10.0,e));
 
    cout<<i;
 
    return 0;
 
}
 
==========================================
 
 
In pratica, come hai suggerito, ho sostituito #include <math.h> con
#include <cmath> ed inoltre, nell'espressione  i= r*(pow(10,e)), ho
sostituito 10 con 10.0.
 
Se ho ben capito, il problema e' che, la funzione pow NON e' definita
come intero: giusto?....inoltre, come mai ,
 
utilizzando  #include <math.h> il compilatore NON mi ha segnalato un
errore?
 
Utilizzo Code::Blocks con compilatore mingw32-g++.exe e s.o. WinVista.
 
 
Ciao e grazie milleeeeee!!!

 Ciao e grazie milleeeeee!!!
 
Ciao, il nuovo standard prevede <cmath> e non <math.h>.
Math.h comunque continua ad essere supportato dai vari compilatori 
(almeno da quello che hai utilizzato tu), pi� che altro per 
retrocompatibilit�.
Se non ti ha segnalato errore, evidentemente il file math.h che hai tu 
contiene ancora la vecchia versione pow(int, int), non standard e quindi 
non presente in cmath.
 


OK...ho notato che se dichiaro i come *double* ed eseguo l' istruzioni
di assegnazione:
 
i=9/2, ottengo 4 come risultato, mentre nei seguenti casi, ottengo
4.5:
 
i=9.0/2;
i=9/2.0;
i=9.0/2.0;
 
...in pratica debbo utilizzare il "punto" almeno al numeratore o al
denominatore della frazione.
 
Ciao e grazie mille!
 

 denominatore della frazione.
 
 
No 1.0 è un double, 1 è un  intero quindi...
 


Quindi il rapporto tra un double e un intero da un double come
risultato.
 
Ciao e grazie mille!

 
 
In pratica, Dio mio, la promozione di tipo è uno dei concetti fondamentali
che si fa nella seconda o terza lezione sul C o C++.
Se sei andato a lezione, dicci chi è il tuo professore, che se non l'ha detto
è scandaloso.
 
Ciao!

 risultato.
 
NO. IMPARA LE REGOLE DI PROMOZIONE.
 


:-) all'esame ?
 
-- 
1) Resistere, resistere, resistere.
2) Se tutti pagano le tasse, le tasse le pagano tutti
Soviet_Mario - (aka Gatto_Vizzato)
 

 [...]
 
 
Ciao  Manlio

 :-) all'esame ?
 
Facile: O studi o ti fai raccomandare.
 
Penso che Osvald chrede che qualcuno su iclc possa 
raccomandarlo. Sbaglia.
 


OK ....sono stato troppo precipitoso nel porre la domanda, diciamo che
la domanda iniziale del post mi ha creato un po' di
confusione....;-)... cmq, al momento, ho studiato superficialmente (e
si vede)  gli argomenti spiegati al corso....considera anche che,
programmazione NON e' l'unica materia che seguo.
 
PS
NON mi massacrate! ;-))
 
Ciao e grazie mille a tutti!

 programmazione NON e' l'unica materia che seguo.
 
Ragazzo, studiare così non serve a niente. Noi non stiamo qui per 
risolvere i tuoi problemi. Noi siamo qui per dare una mano a chi ha
voglia di imparare qualcosa. cresci.
 
 

Il 12/04/2013 12:05, neonano ha scritto:

Come no?
 
-- 
 
Carlo Milanesi
http://carlomilanesi.wordpress.com/