Newsgroup: it.comp.lang.c++
Titolo: come verificare se un numero è int o double?

Salve..
come faccio a verificare se il risultato di x/y è un numero intero?
io ho provato con questo:
if ((int)x/y).......
ma temo sia sbagliato....
potete darmi un suggerimento?
Grazie.


cikko |   
http://cikkox.altervista.org
      | GNU/Linux Registered User #365929
      |    GnuPG/OpenPGP key available

 if( num1 % 2 == 1) ...
Non ha mica chiesto se è pari o dispari!

Fabio ha scritto:

Mi viene in mente qualcosa di simile:
template<typename T>
bool isInteger(const T& val)
{
         int vInt=static_cast<int>(val);
         T vT=static_cast<T>(vInt);
         if (val==vT) return true;
         return false;
}
la funzione ritorna true se il numero che gli passi è un intero, oppure 
se è un numero in virgola mobile ma senza numeri a destra della virgola.
Attenzione: se x e y sono interi e valgono ad esempio 2 e 3 x/y è zero, 
per sapere se invece il quoziente non è intero devi convertirli in float
es.
int x=2,y=3;
bool a=isInteger((float)x/(float)y);
Questa funzione si usa per un numero (float) in generale.
Se a te interessa solo e sempre x/y (interi entrambi) allora puoi fare...
bool isInt=(x % y == 0 ? true:false);
Spero di aver capito la domanda e di essere stato utile.
Ciao.


Ma va!, se non me lo dicevi non lo avevo capito!
Ho scritto nel precedente messaggio:
"... se fra i due numeri uno dei due e`
dispari, allora avrai un double ..."
quell'if serve a quello...


 la prima affermazione (tipo 9/3).
Se il dividendo è multiplo del divisore avrai sempre un risultato intero,
la prima affermazione dunque a che serve ? :)
Mtc

 Mtc
serve appunto per quei numeri che non sono multipli :-)
5 / 2 e` multiplo di che?!


 la prima affermazione (tipo 9/3).
Indubbiamente Fabio non si e' espresso in modo chiaro, ma la tua
risposta ha del surreale.
Se x e y sono di un tipo intero la loro divisione avra' risultato
intero comunque. Se non sono di tipo intero e' necessario controllare
se la divisione da resto zero. Per questo esiste la funzione standard
std::fmod()
Ciao,
Nicola

 std::fmod()
grazie per la precisazione. Mi chiedo: se ha bisogno di controllare il
risultato, vuol dire che le variabili che ha dichiarato sono di tipo double. O
non e` cosi?


 non e` cosi?
Piu' precisamente float, double o long double. Anzi, e' un errore
piuttosto comune aspettarsi un risultato frazionario da una divisione
che coinvolge valori di tipo intero, senza rendersi conto che in quel
caso e' applicata la divisione tra interi.
Ciao,
Nicola

 numeri a destra della virgola.
Il probleme, eventualamente, è che il valore di val non passa su
un int. La soluzione standard :
    bool
    isInteger( double val )
    {
        double tmp ;
        return modf( val, &tmp ) == 0.0 ;
    }
Per il probleme iniziale, c'è " if ( fmod( x, y ) == 0.0 ) ".
E modf e fmod son funzioni standard.
Attenti anche alle particularità dell'aritmetica floating point.
Esiste degli valori dove 1000/i*i != 1000, per essempio. Bisogna
sapere cosa fai.
--
James Kanze                                           GABI Software
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

>risposta ha del surreale.
Si forse mi sono espresso male, faccio un esempio
x=6
y=2
x/y=3 (numero intero)
x=5
y=3
x/y=1.66666... (numero in virgola mobile)
io avrei bisogno una cosa del genere:
int x;
int y;
double z;
cin x;
cin y;
z=x/y;
e qui dovrei mettere un'istruzione del tipo :
"se z č un numero intero"; cout << z;
all'inizio ho dichiarato la variabile Z come double perchč, se fosse
dichiarata come int, verrebbe tolta la virgola nel caso in cui il risultato
fosse in virgola mobile.
E nel caso in cui il risultato fosse davvero in virgola mobile,che
istruzione devo dare per non stampare il risultato?
Devo stampare il risultato solo se Z č un numero intero.
Spero di essermi spiegato...
Grazie

 x/y=1.66666... (numero in virgola mobile)
con x e y dichiarate come int quello che dici _non_ accadra` mai. Devono
essere double. *z* anche se dichiarata double, all'interno avra` sempre un int.



una soluzione adatta agli integer che non fa uso di alcuna 
libreria (adattabile ai floating point con una modifica, 
standard) è :
bool IsMultiploEsatto (long Numerat, long Denominat)
[
long Quot = Numerat / Denominat; // esegue divisione intera
return ((Denominat * Quot) == Numerat);
// true se la divisione è esatta, senza resto
// false altrimenti
];
per i float
bool IsMultiploEsatto (double Numerat, double Denominat)
[
double Quot = Int (Numerat / Denominat); // esegue divisione
// converte anche
return ((Denominat * Quot) == Numerat);
// true se la divisione è esatta, senza resto
// false altrimenti
];
ciao
Soviet_Mario

Fabio wrote:
ti ho risposto nel thread principale sotto la domanda iniziale
ciao
Soviet


 per favore.
Si, OK, capisci che magari dopo una pesante giornata di lavoro uno sia 
un pň abbacchiato...
Se avessi pensato di sostenere un esame forse sarei stato piů attento!

 
Quell'if non serve a nulla: se x e y sono numeri interi x/y sarà sempre 
e comunque un numero intero.
Non esiste che se uno dei due è dispari allora avrai un double (non nel 
caso di divisione fra numeri interi)!
ciao.




 io ho provato con questo:
Provo a risponderti io.
double dVal=x/y;
int iVal=(int)dVal;
double ris= dVal - (double)iVal;
if( ris==0)
{
    //il risultato della divisione è un intero
}
Ciao,
Carlo

Alcune societa' di consulenza fanno domande come questa per vedere come
si conosce il linguaggio ( c o c++ che sia).
"Come fai a vedere se un numero e' pari o dispari senza disporre
dell'operatore '%' ? "
float[double] x = 3;
int res = ( int ) ( x / 2 );
if ( ( res * 2 ) == x )
{
// Pari
}
Ciao
cc ha scritto:


 
if(num&1)
	//numero dispari
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

Si vabbe ma non la capiscono :look:
:)
DevarajA ha scritto:


 
Pero' ora che ci penso.. ma lo standard specifica la base di 
memorizzazione dei numeri? In altre parole: se io realizzassi un 
computer che invece di svolgere tutte le sue funzioni su numeri binari, 
utilizzasse la rappresentazione grafica dei numeri (lol :-), ci potrei 
programmare in c/c++ standard?


 :)
Ovviamente mi riferisco alle aziende non ai lettori di questo ng.... ^^

 
Non lo so, pero' potresti finire in analisi :)
Ciao !

Bruno Ripa ha scritto:

rotfl :-D


 
Vabbè anche io ogni tanto perdo qualche colpo... non volevo infierire...
ciao.

 > if(num&1)
credo non ci sia alcun problema per cio' che riguarda lo standard,
questo se num e' un tipo intero.
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG