Aritmetica floating- point.
Buonasera,
ho un dubbio sulle operazioni aritmetiche floating pooint, cioè se ho due numeri non so se devo prima normalizzare dopodiché eseguo l'operazione carte e penna ed infine controllo se ci sono le condizione di poter rappresentare il risultato in macchina, oppure, eseguo prima l'operazione carta e penna, dopodiché normalizzo ed infine controllo se ci sono le condizioni di poter rappresentare il risultato in macchina.
In partcolare, sia $F(beta, t, U, O)$ insieme dei numeri macchina, e, $a, b in RR$ con $a=f_1*beta^(e_1) , b=f_2*beta^(e_2)$, $a,b$ non in forma normalizzata.
Voglio fare la somma nel mio calcolatore di $a$ con $b$, procedo nella seguente maniera:
Primo schema:
1) controllo se uno dei due operandi siano rappresentabile in $F$ se no, si ha underflow o overflow a secondo che $e_i le U$ o $e_i ge O,$ dunque, non è possibile eseguire l'operazione.
2) supponendo che sia valida la 1), controllo l'esponenti degli operandi se non sono uguali considero l'esponente più grande tra i due operandi e l'operando con esponente più piccolo lo riscrivo come potenza dell'operando con esponente più grande, dopodiché eseguo l'operazione di somma $c=a+b$ carta e penna, invece se sono uguali, eseguo l'operazione di somma $c=a+b$ carta e penna, poi normalizzo $c$, quindi ottengo $fl(c)$
3) si possono presentare due casi: 3.1) $fl(c)$ rappresentabile in $F$ esattamente, in tal caso avrei finito, oppure 3.2) $fl(c)$ rappresentabile in $F$ ma non esattamente cioè l'esponente $Ulee_c le O$ ma le cifre della mantissa sono maggiore di $t$ in tal caso bisogna procedere con una delle due tecniche: arrotondamento o troncamento.
Secondo schema:
1) verifico se $a,b$ sono in forma normalizzata se no li normalizzo,
2) controllo se $fl(a)$ e $fl(b)$ sono rappresentabile, anche non esattamente, nel calcolatore, se non lo sono non è possibile eseguire l'operazione, se no
3) controllo l'esponenti degli operandi se non sono uguali considero l'esponente più grande tra i due operandi e l'operando con esponente più piccolo lo riscrivo come potenza dell'operando con esponente più grande, dopodiché eseguo l'operazione di somma $c=fl(a)+fl(b)$ carta e penna, invece se sono uguali, eseguo l'operazione di somma $c=fl(a)+fl(b)$ carta e penna
4) normalizzo $c$ ed ottengo $fl(c)$,
5) controllo se $fl(c)$ è rappresentabile, anche non esattamente, nel calcolatore, se lo è, si possono presentare due casi:
$fl(c)$ rappresentabile in $F$ esattamente, in tal caso avrei finito, oppure,
$fl(c)$ rappresentabile in $F$ ma non esattamente cioè l'esponente $Ulee_c le O$ ma le cifre della mantissa sono maggiore di $t$ in tal caso bisogna procedere con una delle due tecniche: arrotondamento o troncamento.
Esempio:
Primo schema
$F(beta=10, t=4, U=-99, O=+99)$
Primo esempio: $a=92.14312*10^(-8), b=7.123*10^(-2)$
Allora $a,b$ sono rappresentabili nel mio calcolatore, quindi posso eseguire l'operazione, dunque,
$-8 < -2$ quindi
$a=0.00009214312*10^(-2)$,
$c=a+b=(0.00009214312+7.123)*10^(-2)=7.12309214312*10^-2$
$fl(c)=0.712309214312*10^(-1)$
$fl(c)$ non è rappresentabile esattamente nel calcolatore, poiché le cifre della mantissa $m$ sono maggiore di $4$, quindi, approssimo $fl(c).$
Risulta con la tecnica del troncamento
$0.712309214312*10^(-1)=0.7123*10^(-1)$,
invece con la tecnica del troncamento
$0.712309214312*10^(-1)=0.7123*10^(-1)$.
Secondo esempio: $c=39.7149*10^(-101), d=-384.1274 *10^(-102).$
Non è possibile eseguire l'operazione in macchina poiché ne c e ne d sono rappresentabili.
Con il secondo schema, sia il primo e il secondo esercizio sono eseguibile nel mio calcolatore.
Quale dei due schemi è corretto?
Scusate se sono stato un pochettino lungo con il messaggio, spero di essere stato chiaro.
ho un dubbio sulle operazioni aritmetiche floating pooint, cioè se ho due numeri non so se devo prima normalizzare dopodiché eseguo l'operazione carte e penna ed infine controllo se ci sono le condizione di poter rappresentare il risultato in macchina, oppure, eseguo prima l'operazione carta e penna, dopodiché normalizzo ed infine controllo se ci sono le condizioni di poter rappresentare il risultato in macchina.
In partcolare, sia $F(beta, t, U, O)$ insieme dei numeri macchina, e, $a, b in RR$ con $a=f_1*beta^(e_1) , b=f_2*beta^(e_2)$, $a,b$ non in forma normalizzata.
Voglio fare la somma nel mio calcolatore di $a$ con $b$, procedo nella seguente maniera:
Primo schema:
1) controllo se uno dei due operandi siano rappresentabile in $F$ se no, si ha underflow o overflow a secondo che $e_i le U$ o $e_i ge O,$ dunque, non è possibile eseguire l'operazione.
2) supponendo che sia valida la 1), controllo l'esponenti degli operandi se non sono uguali considero l'esponente più grande tra i due operandi e l'operando con esponente più piccolo lo riscrivo come potenza dell'operando con esponente più grande, dopodiché eseguo l'operazione di somma $c=a+b$ carta e penna, invece se sono uguali, eseguo l'operazione di somma $c=a+b$ carta e penna, poi normalizzo $c$, quindi ottengo $fl(c)$
3) si possono presentare due casi: 3.1) $fl(c)$ rappresentabile in $F$ esattamente, in tal caso avrei finito, oppure 3.2) $fl(c)$ rappresentabile in $F$ ma non esattamente cioè l'esponente $Ulee_c le O$ ma le cifre della mantissa sono maggiore di $t$ in tal caso bisogna procedere con una delle due tecniche: arrotondamento o troncamento.
Secondo schema:
1) verifico se $a,b$ sono in forma normalizzata se no li normalizzo,
2) controllo se $fl(a)$ e $fl(b)$ sono rappresentabile, anche non esattamente, nel calcolatore, se non lo sono non è possibile eseguire l'operazione, se no
3) controllo l'esponenti degli operandi se non sono uguali considero l'esponente più grande tra i due operandi e l'operando con esponente più piccolo lo riscrivo come potenza dell'operando con esponente più grande, dopodiché eseguo l'operazione di somma $c=fl(a)+fl(b)$ carta e penna, invece se sono uguali, eseguo l'operazione di somma $c=fl(a)+fl(b)$ carta e penna
4) normalizzo $c$ ed ottengo $fl(c)$,
5) controllo se $fl(c)$ è rappresentabile, anche non esattamente, nel calcolatore, se lo è, si possono presentare due casi:
$fl(c)$ rappresentabile in $F$ esattamente, in tal caso avrei finito, oppure,
$fl(c)$ rappresentabile in $F$ ma non esattamente cioè l'esponente $Ulee_c le O$ ma le cifre della mantissa sono maggiore di $t$ in tal caso bisogna procedere con una delle due tecniche: arrotondamento o troncamento.
Esempio:
Primo schema
$F(beta=10, t=4, U=-99, O=+99)$
Primo esempio: $a=92.14312*10^(-8), b=7.123*10^(-2)$
Allora $a,b$ sono rappresentabili nel mio calcolatore, quindi posso eseguire l'operazione, dunque,
$-8 < -2$ quindi
$a=0.00009214312*10^(-2)$,
$c=a+b=(0.00009214312+7.123)*10^(-2)=7.12309214312*10^-2$
$fl(c)=0.712309214312*10^(-1)$
$fl(c)$ non è rappresentabile esattamente nel calcolatore, poiché le cifre della mantissa $m$ sono maggiore di $4$, quindi, approssimo $fl(c).$
Risulta con la tecnica del troncamento
$0.712309214312*10^(-1)=0.7123*10^(-1)$,
invece con la tecnica del troncamento
$0.712309214312*10^(-1)=0.7123*10^(-1)$.
Secondo esempio: $c=39.7149*10^(-101), d=-384.1274 *10^(-102).$
Non è possibile eseguire l'operazione in macchina poiché ne c e ne d sono rappresentabili.
Con il secondo schema, sia il primo e il secondo esercizio sono eseguibile nel mio calcolatore.
Quale dei due schemi è corretto?
Scusate se sono stato un pochettino lungo con il messaggio, spero di essere stato chiaro.
Risposte
Un computer esegue operazioni floating-point solo su valori che sono già nella rappresentazione corretta. La prima operazione è quindi quella di portare i due valori nella corretta rappresentazione floating-point. Se uno dei due numeri non è rappresentabile allora incontrerai un errore prima di eseguire la somma. Nota che in pratica questa operazione avviene una sola volta quando converti da una rappresentazione diversa a floating-point e non ogni volta che esegui una operazione.