underflow/overflow reali

Stato
Discussione chiusa ad ulteriori risposte.

Whivel

Utente Electrum
11 Luglio 2007
692
2
100
176
mi serve sapere se per avere l'underflow per 1/x, è condizione necessaria e sufficiente che x sia in overflow
 
Teoricamente sì. Se prendiamo il formato float previsto dall'IEEE 754 con 8 bit di esponente, posso rappresentare tutti i numeri il cui ordine di grandezza va da 2^(-127) a 2^127 (assumendo che l'esponente -128 venga usato per rappresentare grandezze speciali come lo zero, -inf, +inf e NaN). Quindi se con x = 2^128 ho un overflow, poiché 1/x = 2^(-128) avrò sicuramente un underflow. In realtà ci sarebbe anche la mantissa di cui tener conto, ma si può stare sicuri che con un numero nell'ordine di 2^(-128) nessuna mantissa può generare una quantità valida rappresentabile da un float. Tutto questo ovviamente è valido in linea teorica. Se i compilatori o la CPU implementano magie nere o giochi strani per evitarlo, non lo so.
 
ci sarebbe la denormalizzazione, ma credo che la fpu in quel caso generi anche underflow.... cmq grazie, mi aspettavo una risposta da te (tra l'altro ben spiegata) ^^
ritengo che lo stesso discorso valga anche per i double.... beh la cosa mi conforta ^^
 
Sì ovviamente lo stesso discorso vale anche per i double, dato che cambia solo il numero di bit riservati a esponente e mantissa ma non il comportamento numerico.

p.s. Starai mica facendo una libreria per gestire a basso livello l'IEEE 754?
 
al momento non avrei tempo ^^ è solo un esercizio dell'esame di assembly che ho fatto ieri.
dovevo prelevare 2 numeri in modulo e segno (A e B) e fare A^B. la soluzione migliore sarebbe fare (1/A)^|B| se B era negativo, ma siccome non ci ho pensato ho fatto X=A^|B| e poi 1/X. ovviamente X può andare in overflow, "mascherandomi" quindi l'uderflow di 1/X.
Posso correggere l'esercizio via rete, ma più correzioni faccio, più mi si può abbassare il voto, quindi questa domanda mi serviva, in caso di risposta positiva, ad evitare un gran numero di correzioni spostando solo 2 righe.

Non è proprio una cosa interessante come la libreria, ma al momento è la cosa più importante per me (ovviamente posso sempre rifare l'esame al prossimo appello ^^)


:EDIT:
cercando su internet ho trovato:
http://www2.ing.unipi.it/~a080368/Programmazione/Materiale/Note%20sulla%20FPU.pdf ha detto:
Il fattore di polarizzazione
dell’esponente è stato scelto in modo tale che il numero più piccolo possibile abbia un
inverso entro l’intervallo di rappresentabilità
questo indica se l'operazione non va in underflow, allora sicuramente non ci sarà l'overflow del reciproco, ma credo che il discorso valga pure al contrario
 
[ot]
Qui Mariusp, pianeta: Terra, lingua parlata: italiano, in che lingua parlate? Non capisco il marzianese[/ot]
 
Stea ha detto:
Visto che i numeri prossimi allo zero sono rappresentati in mododenormalizzato,le cose sono un po' piu' complicate. Uno si puo' calcolare amano fin dove arrivi l'intervallo di rappresentabilita' verso lo zeroqualora si impieghino numeri denormalizzati, ma lo trovo un esercizio ozioso(ha senso chiedersi se 1/X e' rappresentabile quando X ha un solo bitsignificativo nella mantissa? Qualunque numero venisse fuori dal contosarebbe approssimato grossolanamente). Le poche assunzioni che uno puo' fare sono quindi:- se X e' un numero ***normalizzato*** "piccolo", il calcolo di 1/X non da'overflow, in quanto 1/X e' certamente rappresentabile- se X e' un numero denormalizzato (quindi "piccolo"), il calcolo di 1/X**puo'** dare overflow (e quindi 1/X puo' non essere rappresentabile, nelqual caso il risultato sara' +/-Inf).- se X e' un numero normalizzato "grande", il calcolo di 1/X **puo'**produrre un numero denormalizzato, ma trovo estremamente improbabile chel'operazione generi underflow (non posso pero' esserne sicuro al 100%).
Questo è quello che ha scritto il mio professore e, se non ho capito male, il ragionamento porterebbe a dire che non è ciondizione necessaria e sufficiente
 
Il ragionamento del professore ovviamente è perfettamente valido, ma parla sempre di X come "numero normalizzato grande", quindi numero rappresentabile nella macchina senza procurare overflow, ed è normale che sia sempre invertibile. Tu invece parlavi di un numero già in overflow, ovvero >= (N_MAX + 1). Il suo reciproco sarà sicuramente una quantità in underflow.
 
BlackLight ha detto:
Il ragionamento del professore ovviamente è perfettamente valido, ma parla sempre di X come "numero normalizzato grande", quindi numero rappresentabile nella macchina senza procurare overflow, ed è normale che sia sempre invertibile. Tu invece parlavi di un numero già in overflow, ovvero >= (N_MAX + 1). Il suo reciproco sarà sicuramente una quantità in underflow.
questo è quello che credo anch'io,anche se in realtà c'è la possibilità che venga rappresentato denormalizzato (e qui non so se genera o meno underflow): Ho rifatto la domanda in maniera più chiara e lui mi ha risposto di rileggere il messaggio.

kama ha detto:
tu dopo che fai l'esame puoi modificare il compito da casa? WUT?!

è un a prova pratica di assembly e java. Dopo che hai consegnato i programmi (2h e 30m circa), puoi correggerli attraverso una pagina web. In realtà la correzione è un insieme di regole. Se il programma NON da l'output che ci si aspetta, il programma non viene nemmeno visto.
Solo nel caso l'output sia corretto allora l'esercizio viene valutato.

In realtà esiste un 3 caso, di cui sono protagonista insieme ad un amico, di cui non conosco le conseguenze: l'output è corretto, ma il programma ha un bug (il caso di errore non è presente nei casi del test). Il mio problema è proprio l'underflow, che non verrà mai notificato.
 
Stato
Discussione chiusa ad ulteriori risposte.