Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Rappresentazione in complemento e normalizzazione di un binario

    Salve a tutti .
    Ho qualche problema con gli esercizi concernenti la rappresentazione dei numeri binari.
    In particolare ciò che non mi è chiaro è il significato della rappresentazione in complemento a uno o a due e della normalizzazione di un numero.
    Per farvi comprendere le mie difficoltà posto un esercizio svolto:

    Dato il numero razionale m rappresentato in tale notazione (1 bit segno, 8 per l'esponente in eccesso 128 e 7 bit per mantissa normalizzata tra 1 e 2) dai due byte 41A5, calcolare l'intero n che approssima m per difetto e rappresentarlo in complemento a due con 16 bit:

    I due byte in binario diventano: 0100 0001 1010 0101.
    Si complementa il bit più significativo dell'esponente e si ottiene 0000001, che equivale a 3 in base 10.
    La mantissa è 1,0100101 e dunque il numero rappresentato è 1010,0101. Lo si approssima per difetto a 1010.
    In complemento a due in 16 bit il numero sarà 0000000000001010.


    Bene, ci sono tre punti oscuri:
    1) Che senso ha complementare solo il bit più significativo dell'esponente? E perché complementarlo?
    2) Perché sposto la virgola della mantissa a destra di tre posti?
    3) Il risultato finale vuol dire che il complemento a due di un binario di soli 4 bit si ottiene aggiungendo solo zeri?

    Grazie .

  2. #2
    Ciao,

    un numero in virgola mobile si può rappresentare con la formula:


    dove:
    S è il segno(0 se il numero è positivo, 1 se il numero è negativo).
    E è l'esponente.
    M è la mantissa (cioè la parte frazionaria).

    Lo standard IEEE P754 prevede che, quando per rappresentare un valore reale sono usati 32 bit (singola precisione), questi siano ripartiti secondo il seguente schema:

    –> 1 bit per il segno S
    –> 8 bit per l’esponente E
    –> 23 bit per la mantissa M

    Graficamente:


    Per i numeri in virgola mobile a precisione doppia(64 bit), lo schema è il seguente:

    –> 1 bit per il segno S
    –> 11 bit per l’esponente E
    –> 52 bit per la mantissa M

    L'esponente deve potere assumere valori negativi. Nella rappresentazione polarizzata, una costante viene sottratta al valore contenuto nell’esponente per ricavare il valore “vero” dell’esponente stesso.
    Nello standard IEEE P754 su 32 bit la quantità di polarizzazione è pari a 127 e la rappresentazione polarizzata è detta codice eccesso 127.

    La mantissa, per garantire che il numero sia unicamente rappresentato, viene portata ad avere un valore >= 1 e < 2 e l’esponente viene adattato opportunamente, quindi si hanno sempre numeri della forma 1,aaaa...a.
    Poiché l'uno alla sinistra della virgola esiste sempre, si risparmia un bit di spazio se non lo si rappresenta(hidden bit).
    Eccezione alla regola è costituita dal numero zero che si rappresenta impostando a zero tutti i bit.

    Vediamo un esempio.

    Per rappresentare il numero 5.12 nello standard IEEE a precisione singola(32 bit):

    a) il numero è positivo, dunque il bit di segno(il bit più significativo e cioè quello più a sinistra), vale 0.
    b) 5,21 in binario, è uguale a 101,000111.
    c) spostiamo la virgola di due posizioni verso sinistra e moltiplichiamo per 2 elevato al numero di posizioni: 1,01000111*2^2 (questo procedimento prende il nome di normalizzazione).
    d) l'esponente in codice eccesso 127 è 2 + 127 = 129 che, in formato binario, è uguale a 10000001.

    Dunque, il risultato è:

    0 10000001 01000111000000000000000


    Nel caso del tuo esercizio, la rappresentazione non è nel formato standard visto che prevede 7 bit per la mantissa e un codice eccesso 128.
    Il numero si rappresenta così:

    0 10000011 0100101 (10,3125 in decimale).

    Il bit più significativo vale 0; dunque il numero è positivo. Gli otto bit successivi rappresentano l'esponente:

    10000011 in decimale è uguale a 131; essendo in codice eccesso 128, bisogna sottrargli 128:

    131 - 128 = 3.

    I sette bit meno significativi, rappresentano la parte frazionaria della mantissa:

    0100101 considerando l'hidden bit, diventa 1,0100101. Per ottenere il numero rappresentato, spostiamo la virgola verso destra di 3(131 - 128) posizioni: 1010,0101.

    Arrotondiamo per difetto (non consideriamo cioè la parte frazionaria) il risultato che diventa, quindi, 1010.
    La rappresentazione su sedici bit è la seguente:

    0000 0000 0000 1010.

    In generale, dato un numero N in base b su x cifre, si definisce complemento alla base:

    b^x - N.

    Quando la base è 2, si ha il complemento a 2. Per il calcolo si applica il seguente algoritmo:

    a) partendo da destra si trascrivono tutti gli 0 fino ad incontrare il primo 1 e si trascrive anch'esso.
    b) si complementano a 1 (e cioè tutti gli 0 diventano 1 e viceversa) tutti i restanti bit.

    nel nostro caso, abbiamo:

    0000 0000 0000 1010 (10 in decimale).

    Partendo da destra incontriamo uno 0 e lo trascriviamo:

    0

    il secondo bit incontrato vale 1; lo trascriviamo:

    10

    i bit successivi vanno tutti complementati a 1:

    1111 1111 1111 0110 (-10 in decimale).

    Un altro modo per ottenere il complemento a due di un numero è il seguente:

    a) si complementa a uno il numero.
    b) si aggiunge 1 al risultato.

  3. #3
    Ti ringrazio davvero per la tua risposta: definirla esauriente e soddisfacente è dire poco ; se fossero tutti come te, i forum pian piano diventerebbero delle enciclopedie!
    Vorrei approfittare ancora della tua conoscenza per mettere definitivamente delle pezze su ciò che so del linguaggio binario.

    Ho provato (da solo e senza soluzione alla mano) a svolgere un esercizio. Ti chiedo di vedere se è giusto e di chiarirmi alcuni dubbi.

    Si considerino due notazioni binarie in virgola mobile a 16 bit, entrambe con 1 bit per il segno (0=positivo), e bit per l'esponente, rappresentato in eccesso 2^(e-1), ed i rimanenti m bit per la parte frazionaria della mantissa che è normalizzata tra 1 e 2. Nella prima notazione e=4 ed m=11, nella seconda e=8 ed m=7.
    Dato il numero n rappresentato nella prima notazione dalla stringa 35D7, rappresentarlo nella seconda notazione;


    In binario il numero diventa: 0011 0101 1101 0111.

    Inizio a normalizzare la mantissa: per farlo dovrò innanzitutto prendere in esame solo le prime 7 cifre significative delle "vecchie" 11.
    Dunque avrò: 1011101. Normalizzo: 1,1011101 * 2^7.
    Poiché adesso sono in eccesso 127, l'esponente sarà 127+7=134. In binario è: 10000110.
    Nella nuova notazione il binario sarà: 0 10000110 1011101.


    Passiamo alle mie domande, spero di non abusare del tuo aiuto .
    1) Perché per ottenere l'esponente devo sommare 127? Non dovrei sommare solo 7, visto che si tratta di 2^7 e non 2^127?
    2) A cosa serve il complemento a due (o a uno)?
    3) Perché nella tua risoluzione del mio esercizio sottrai 128 a 131?

    Grazie per la pazienza .

  4. #4
    Ciao,

    purtroppo il procedimento che hai usato non è corretto. Vediamo perchè.

    Rappresentiamo il numero che hai calcolato con degli spazi tra il segno, l'esponente e la mantissa:

    0 10000110 1011101

    Eseguiamo i calcoli per vedere qual è il valore decimale rappresentato:

    Segno 0: il numero è positivo.

    Esponente = 10000110 che in decimale è uguale a 134 e al quale dobbiamo sottrarre il codice eccesso( 128 = 2^(8-1) ):

    134 - 128 = 6

    La parte frazionaria della mantissa è 1011101. Calcoliamo il corrispondente valore in decimale:

    2^-1 + 2^-3 + 2^-4 + 2^-5 + 2^-7 = 0,5 + 0,125 + 0,0625 + 0,03125 + 0.0078125 = 0.7265625

    Applicando la seguente formula

    (-1)^s * (1 + M') * 2^(E-128)

    dove s è il segno, M' è la parte frazionaria della mantissa e E-128 rappresenta l'esponente

    si ottiene:

    (-1)^0 * (1 + 0,7265625) * 2^6 = 1,7265625 * 64 = 110,5


    Applichiamo gli stessi calcoli per il numero rappresentato, nella prima notazione, da 35D7:

    0 0110 10111010111

    Codice eccesso: 2^(4-1) = 8.
    Segno 0: il numero è positivo.
    Esponente: 0110 = 6 in decimale. Essendo in codice eccesso 8, bisogna sottrargli 8:
    6 - 8 = -2 (L'esponente è dunque negativo).

    Parte frazionaria della mantissa:

    10111010111 = 1*2^-1 + 0*2^-2 + 1*2^-3 + 1*2^-4 + 1*2^-5 + 0*2^-6 + 1*2^-7 + 0*2^-8 + 1*2^-9 + 2^-10 + 2^-11 =

    2^-1 + 2^-3 + 2^-4 + 2^-5 + 2^-7 + 2^-9 + 2^-10 + 2^-11 =

    = 0,5 + 0,125 + 0,0625 + 0,03125 + 0,0078125 + 0,001953125 + 0,0009765625 + 0,00048828125 = 0,72998046875

    Applicando la formula:

    (-1)^0 * ( 1 + 0,72998046875 ) * 2^-2 = 1,72998046875 * 0.25 = 0,4324951171875

    Dunque il numero decimale rappresentato da 35D7 vale circa 0,432495 e non 110,5.


    Rappresentiamo il numero 0,432495 nella seconda notazione, come chiede l'esercizio:

    Il numero è positivo: segno 0.
    0,432495 = 0,01101 perchè:

    La parte intera, 0, è uguale sia in decimale che in binario. Per la parte frazionaria si eseguono i seguenti calcoli:

    codice:
    0,432495*
           2
    --------
    0,864990*
           2
    --------
    1,729980*   (Attenzione: ogni volta che il risultato è > 1, sottraiamo 1 prima di moltiplicare).
           2
    --------
    1,459960*
           2
    --------
    0,919920*
           2
    --------
    1,839840

    Spostiamo la virgola di due posizioni a destra, in modo da ottenere un 1 alla sinistra della virgola (così come richiesto dalle regole per le quali la mantissa normalizzata deve essere compresa tra 1 e 2):

    1,101

    Spostando di di due posizioni verso destra (invece che verso sinistra), l'esponente è ovviamente negativo: -2.

    Quindi il numero si normalizza così:

    1,101 * 2^-2

    L'esponente, in codice eccesso 8, è:

    -2 + 8 = 6

    6 in binario è uguale a 110

    e, dunque, il risultato è:

    0 00000110 1010100


    Per quanto riguarda le domande prima e terza, ormai, dagli esempi precedenti, dovrebbe esserti chiara la risposta.
    La rappresentazione in complemento a 2 è l'ideale per i numeri interi con segno perchè non ha il problema del doppio zero e facilita i calcoli.
    Qui trovi qualche esempio:

    http://home.dei.polimi.it/sykora/inf...es1/node9.html


    Ciao

  5. #5
    Ciao di nuovo !
    Grazie per aver risposto ancora una volta. Ti chiedo ancora un po' di aiuto (e di pazienza).
    Vorrei postarti un altro esercizio (da me svolto e senza soluzione) per vedere se ho fatto progressi.

    Si consideri una rappresentazione binaria in virgola mobile a 16 bit, di cui 1 per il segno, e=8 per l'esponente, che è rappresentato in eccesso 2^(e-1), e 15-e=7 per la parte frazionaria della mantissa.
    Dato il numero r rappresentato nella notazione suddetta dalla stringa esadecimale CA37, calcolare il numero intero che lo approssima per eccesso, specificandone la rappresentazione in complemento a 2 con 16 bit, e l'ordine di grandezza binario.


    In binario diventa: 1100 1010 0011 0111
    Siamo in eccesso 128 e l'esponente 10010100 vale 148: 148-128=20.
    Dunque la mantissa 1,0110111 si normalizzerà così: 101101110000000000000.
    In complemento a due verrà: 0100100100000000 (togliendo gli ultimi zeri).
    L'ordine di grandezza binario (se è questo quello che intende) è compreso tra 2^21 e 2^22.

    Mantenendo invariata la prima parte dell'esercizio, c'è una domanda che non capisco:
    Calcolare l'ordine di grandezza decimale degli estremi dell'intervallo dei numeri non rappresentabili attorno allo 0.
    Potresti spiegarmi il suo significato?

    Vorrei chiederti le seguenti delucidazioni:
    1) Non riesco a capire esattamente cosa sia il codice eccesso. E soprattutto quali sono i casi in cui esso va sottratto o addizionato al valore dell'esponente.
    2) La formula (-1)^s * (1 + M') * 2^(E-128) da dove l'hai presa?
    3) Nell'ultimo mio esercizio da te risolto, hai scritto che la mantissa è: 1010100. Ma dalle moltiplicazioni per due che hai condotto, non dovrebbe essere 001101? A proposito, che cos'è questo metodo delle moltiplicazioni per 2?
    4) Spesso, nei miei esercizi svolti, quando compaiono codici a 3 byte, il Prof. opera la rappresentazione in modulo: perché?
    5) Per caso conosci un sito dove trovare formule utili per queste cavolo di conversioni o rappresentazioni o che so io di codici in binario?

    Mi rendo conto che ancora ho molte lacune e che con quest'ultimo post ti ho tartassato ! Ma tieni presente che sebbene stia studiando moltissimo, non riesco a mettere insieme le mie conoscenze; come se avessi tutte la parti di una equazione, ma non il suo risultato. Non so dove sbaglio. Tu che dici?
    Un bel guaio!
    Grazie ancora .

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,459

    Moderazione

    Tutto molto bello (come direbbe Pizzul), ma cosa ha a che fare con la programmazione?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,459

    Moderazione

    Originariamente inviato da KaranSjet
    Ti ringrazio davvero per la tua risposta: definirla esauriente e soddisfacente è dire poco ; se fossero tutti come te, i forum pian piano diventerebbero delle enciclopedie!
    Infatti non dovrebbe diventare una enciclopedia, soprattutto se si risponde copiando e incollando i testi individuati in altre fonti e spacciandole per proprie (visto che la fonte non è citata), anche per rispetto dell'autore originale.

    Infatti, tutte le informazioni fornite nella risposta sono state copiate e incollate direttamente da questo documento.

    Se si rispondere ad una domanda sfruttando fonti esterne, si indica la fonte, altrimenti si indica un link dove scaricare il documento per poterlo consultare in autonomia.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Non ero al corrente della mancata citazione: sicuramente non è il massimo della limpidezza.
    Sulla tua idea che il codice binario non è attinente alla programmazione e che ti aggrappi a mie affermazioni come quella sull'enciclopedia, non mi trovi d'accordo.
    A mio avviso il codice binario costituisce eccome un linguaggio, che è quello che usa la CPU per elaborare programmi scritti in linguaggio macchina. E il linguaggio macchina è costituito proprio dal linguaggio binario. D'accordo: non è un linguaggio come Java (dunque orientato a oggetti e di alto livello), ma questo non serve a snaturarlo.
    Sul fatto della "enciclopedia", non capisco cosa vuoi dire. Il mio era un semplice modo per dire che con interventi lunghi, ma allo stesso tempo precisi e mirati, i forum si arricchiscono e possono dare contributi - in termini di aiuto e informazioni- come quelli di una enciclopedia. Se non ti è piaciuto il termine posso capire, ma non condividere.
    Comunque grazie per aver scovato il link "omesso", credo che mi sarà di grande aiuto .

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,459
    Originariamente inviato da KaranSjet
    Non ero al corrente della mancata citazione: sicuramente non è il massimo della limpidezza.
    E' il motivo per cui ho quotato la tua frase, ma ovviamente non stavo contestando a te la mancata citazione.

    Originariamente inviato da KaranSjet
    Sulla tua idea che il codice binario non è attinente alla programmazione e che ti aggrappi a mie affermazioni come quella sull'enciclopedia, non mi trovi d'accordo.
    Non devi solamente guardare la parte dei messaggi che cito, ma anche quello che scrivo.
    Se colgo un tuo intervento per "bacchettare" qualcun'altro, non offendertene tu.

    Originariamente inviato da KaranSjet
    A mio avviso il codice binario costituisce eccome un linguaggio, che è quello che usa la CPU per elaborare programmi scritti in linguaggio macchina. E il linguaggio macchina è costituito proprio dal linguaggio binario. D'accordo: non è un linguaggio come Java (dunque orientato a oggetti e di alto livello), ma questo non serve a snaturarlo.
    So cos'è il "linguaggio macchina", ma in questo caso non si tratta di un problema legato alla programmazione con il linguaggio macchina, né di un errore legato a questo, bensì si tratta di un quesito che riguarda la rappresentazione generale di dati, quindi è "off topic".

    Secondo la concezione che scrivi, altrimenti, si parlerebbe qualsiasi cosa in quest'area, inclusi gli argomenti trattati nelle altre.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10

    Re: Moderazione

    Originariamente inviato da alka
    ...
    Se si rispondere ad una domanda sfruttando fonti esterne, si indica la fonte, altrimenti si indica un link dove scaricare il documento per poterlo consultare in autonomia.
    E l'avrei fatto se solo ne avessi avuto la possibilità. È da stamattina che tento di accedere al sito ma è lentissimo, una pagina si apre dopo un sacco di tempo (adesso va un po' meglio, ma è sempre molto lento).
    Proprio in risposta alla domanda di KaranSiet che mi chiedeva di indicargli qualche sito dove potere studiare, avrei indicato questo:

    http://corsiadistanza.polito.it/corsi/pdf/09ASODN/

    che contiene il pdf che hai citato tu insieme ad altri che spiegano tutto quello che c'è da sapere sull'argomento.

    Per quanto riguarda il fatto che l'argomento non riguardi la programmazione, non sono affatto d'accordo. Si potrebbe volere implementare una propria rappresentazione dei numeri in virgola mobile per avere, ad esempio, una maggiore precisione rispetto a quella offerta dal tipo long double del C.

    Infine, avrei una domanda: il fatto della lentezza nel caricamento delle pagine di html.it, negli ultimi giorni, mi capita spesso. La cosa è dovuta a problemi del server o capita solo a me?


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 © 2025 vBulletin Solutions, Inc. All rights reserved.