PDA

Visualizza la versione completa : [C++] Determinare se il risultato di una moltiplicazione "sforerà" int


xnavigator
04-01-2010, 16:08
mettiamo caso che ho

a=30.000.000
b=300.000.000;

entrambi i numeri sono rappresentabili come int ma se provo a fare la loro moltiplicazione

c= a*b;
avrò un risutlato negativo..

c'è un modo per sapere in anticipo che sforerò quel limite e quindi casomai effettuare un'altra operazione?

grazie

oregon
04-01-2010, 16:11
Calcola i logaritmi in base 2 dei valori e sommali

xnavigator
04-01-2010, 18:06
panico..


mi basta controllare quindi che non superino 32 :zizi:

MItaly
04-01-2010, 18:54
Più semplicemente, tu in effetti devi verificare che


a*b<MAX_INT
a*b>MIN_INT

; scritto così naturalmente non va bene, dato che anche in questo caso a*b potrebbe andare in overflow/underflow. Tuttavia le disequazioni equivalenti


a<MAX_INT/b
a>MIN_INT/b

non presentano problemi di overflow (naturalmente devi controllare prima che b!=0). Tuttavia se b è negativo i segni delle disequazioni vanno invertiti.
Codice di esempio: https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+no t+result+in+overflow?showComments=false

Se te la cavi con l'assembly e se l'architettura per cui stai scrivendo il codice fornisce un overflow bit puoi sempre controllarlo; su architettura x86 potresti ad esempio usare l'istruzione JO, ma in questo non ti so aiutare.

xnavigator
05-01-2010, 21:19
a questo punto conviene fare il logaritmo
:zizi:

MItaly
05-01-2010, 21:31
Per i logaritmi devi usare i numeri in virgola mobile, per cui tanto vale convertire i due numeri in double (con cui non rischi overflow usando due interi a 32 bit) e confrontare il risultato con MAX_INT/MIN_INT.

oregon
06-01-2010, 01:38
Oppure controlli la posizione del primo bit più significativo posto ad 1 dei due valori.

Puoi operare con semplici shift di bit ...

MItaly
06-01-2010, 10:48
Questo è molto più efficiente, ma più approssimativo, visto che non si considera il valore degli altri bit.

Loading