PDA

View Full Version : [c++ / identificare se un double è intero]


unslee
18-07-2008, 15:31
Ciao a tutti,
ho un dubbio ... supponiamo che un'espressione mi restituisca un numero double. Come posso fare per capire se il numero che mi ha restituito, pur rimanendo un double, è anche matematicamente un intero?

Per esempio:
Numero double 1.6667
Numero double 2.0000

C'è una procedura che mi permetta di identificare i numeri restituiti come il secondo?

Avrei bisogno di questa info per capire come posso scartare da un conteggio tutti i numeri da 1 a 10.000 la cui radice quadrata sia un numero intero.

Grazie anticipatamente,

Unslee

Ziosilvio
18-07-2008, 15:36
supponiamo che un'espressione mi restituisca un numero double. Come posso fare per capire se il numero che mi ha restituito, pur rimanendo un double, è anche matematicamente un intero?
Temo di non conoscere a sufficienza lo standard dei numeri in virgola mobile per poterti dare una risposta esauriente e corretta.
Temo però che, o la cosa sia impossibile, o ci sia qualche funzione di libreria che lo fa.
Avrei bisogno di questa info per capire come posso scartare da un conteggio tutti i numeri da 1 a 10.000 la cui radice quadrata sia un numero intero.
Beh, questo lo puoi fare a mano con una cosa del tipo:
int k = (int)sqrt(n); // k: massimo intero non maggiore di sqrt(n)
if (n==k*k) cout << n << " ha la radice quadrata intera" << endl;
else cout << n << " non ha la radice quadrata intera" << endl;

gugoXX
18-07-2008, 16:23
Direi che il metodo di ZioSilvio e' il piu' efficiente.

Se invece ti interessa a priori conoscere se un numero in virgola mobile e' in realta' un numero Naturale, entro certi limiti puoi usare la seguente:

if (d == Round(d)) then ...

Ovvero, se il numero e' uguale al troncamento ad intero del numero, allora e' naturale...

Tale check funziona solo fino ad un certo valore, per la natura della rappresentazione interna dei numeri in virgola mobile (che e' il dubbio di ziosivlio penso)
sui float a 32bit tale limite e' 2^23 = 8388608 (23 e' la mantissa dei virgola mobile 32bit)
sui double a 64bit tale limite e' 2^52 = 4503599627370496

kk3z
18-07-2008, 16:40
Oppure prova con modf (http://www.cppreference.com/stdmath/modf.html)

unslee
18-07-2008, 17:02
Come sempre siete eccezionali!

Non riuscivo a trovare una soluzione ed adesso ne ho ben tre!

:D

Veramente grazie. Con la soluzione di Ziosilvio ho appena finito di risolvere il prob ed il programma gira correttamente. Adesso mi testo anche le altre due per vedere se l'applicazione si velocizza e soprattutto per scienza personale!

Buona serata a tutti e ancora grazie,

Unslee