Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [c++] conoscere in anticipo se il risultato di una moltiplicazione sforerà int

    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Calcola i logaritmi in base 2 dei valori e sommali
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    panico..


    mi basta controllare quindi che non superino 32

  4. #4
    Più semplicemente, tu in effetti devi verificare che
    codice:
    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
    codice:
    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/co...Comments=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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    a questo punto conviene fare il logaritmo

  6. #6
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Oppure controlli la posizione del primo bit più significativo posto ad 1 dei due valori.

    Puoi operare con semplici shift di bit ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Questo è molto più efficiente, ma più approssimativo, visto che non si considera il valore degli altri bit.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.