Perché la rappresentazione in virgola mobile utilizza un bit di segno anziché il complemento di 2 per indicare numeri negativi


20

Considera una rappresentazione in virgola fissa che può essere considerata come un caso degenerato di un numero mobile. È del tutto possibile utilizzare il complemento di 2 per i numeri negativi. Ma perché è necessario un bit di segno per i numeri in virgola mobile, i bit di mantissa non dovrebbero usare i complementi di 2?

Inoltre, perché i bit esponenti usano un bias invece di una rappresentazione di magnitudine firmata (simile ai bit mantissa) o la rappresentazione del complemento di 2?

Aggiornamento: mi dispiace se non l'ho chiarito. Stavo cercando il motivo di come si forma la rappresentazione in virgola mobile. Se non esiste un forte compromesso tra le alternative, qualcuno potrebbe spiegare gli aspetti storici della rappresentazione in virgola mobile?

Risposte:


7

Il complemento a due ha senso quando le due entità in questione hanno le stesse "unità" e la stessa "larghezza". Per larghezza intendo che, per esempio, se stai aggiungendo un numero N bit e un numero M bit, dove N e M sono diversi, allora è meglio non usare il complemento a due. Per i numeri in virgola mobile, abbiamo il problema delle unità: se gli esponenti sono diversi, allora stiamo spostando mentalmente una delle mantisse, e ora siamo allo stesso problema di prima (con la larghezza).

Per quanto riguarda i bit esponenti, usando un bias invece di segno + magnitudine otteniamo un valore in più (altrimenti avremmo +0 e -0). Qui il complemento a due ha senso quando si moltiplicano o si dividono i numeri (da allora stiamo aggiungendo o sottraendo gli esponenti), ma non tanto ha senso quando si aggiungono o sottraggono.

Modifica: un commentatore ha osservato che è possibile aggiungere numeri interi di complemento a due di lunghezze diverse utilizzando l'estensione del segno. C'è anche qualche problema con il rilevamento di overflow, ma è anche risolvibile. In sintesi, probabilmente potresti usare il complemento a due, se stai abbastanza attento. (È inoltre necessario gestire la moltiplicazione e la divisione.)


4
"Se stai aggiungendo un numero N bit e un numero M bit, dove N e M sono diversi, allora è meglio non usare il complemento a due" - Potresti chiarire un po '? Credo che sia del tutto possibile firmare l'estensione di un numero usando una rappresentazione di complemento di 2 usando il suo MSB, ad esempio 4'b1111 si estenderà a 5'b11111 e 4'b0111 -> 5'b00111. Non dovrebbe essere semplice aggiungere questo al cambio del barilotto esistente all'interno di una logica aritmetica in virgola mobile?
koo,

La ringrazio per la risposta! Ho modificato la domanda in modo che mi chieda più chiaramente cosa rende l'attuale virgola mobile.
koo,

4

Da Wikipedia:

Il sistema del complemento a due ha il vantaggio che le operazioni aritmetiche fondamentali di addizione, sottrazione e moltiplicazione sono identiche a quelle per i numeri binari senza segno ...

Il complemento a due è una rappresentazione di numeri negativi che è molto conveniente. Questo è l'intero motivo per usarlo affatto.

Una coppia mantissa-esponente è una rappresentazione di un numero in virgola mobile. Il più delle volte quando si usano numeri in virgola mobile, non si esegue l'aritmetica esclusivamente sulla mantissa o esclusivamente sull'esponente.


4

Ma perché è necessario un bit di segno per i numeri in virgola mobile

Falso presupposto. Non è necessario Sono abbastanza sicuro di aver incontrato formati in virgola mobile che utilizzavano il complemento di 2 per la mantissa, ma avrei dovuto cercare i nomi.

Sono lungi dall'essere uno specialista in analisi numerica, ma capisco che avere firmato zero è importante per loro. È probabilmente più facile da manipolare del complemento di quelli. Quello era probabilmente un criterio nella scelta per IEEE-754.

Inoltre, perché i bit esponenti usano un bias anziché una rappresentazione con magnitudine firmata

Ancora una volta non è necessario e alcuni hanno fatto le cose diversamente.

È la rappresentazione per la quale è più semplice eseguire un'implementazione hardware per l'insieme di operazioni eseguite sugli esponenti (e qui non è richiesta una rappresentazione per -0).

Una delle conseguenze di quella scelta è che puoi usare il confronto di numeri interi con segno per confrontare il numero FP se non ti interessa NaN, che forse era un criterio per alcuni (il fatto che NaN abbia bisogno di una gestione speciale mi fa dubitare che non lo fosse per IEEE-754).


I confronti di numeri interi firmati classificheranno i numeri FP negativi all'indietro. Per loro una corretta classificazione, sarebbe stato necessario un qualche tipo di formato di complemento, con il complemento di quelli probabilmente il migliore (uno negativo sarebbe ... 110.1111 ..., con infiniti a sinistra ea destra).
supercat

3
MIL-STD-1750A è probabilmente l'architettura del processore più utilizzata che specifica una rappresentazione in virgola mobile del complemento a due. Nella sezione 4.1: "Il set di istruzioni deve supportare la precisione singola in virgola fissa a 16 bit, la precisione doppia in virgola fissa a 32 bit, il virgola mobile a 32 bit e il virgola mobile a 48 bit con dati di precisione estesa nella rappresentazione del complemento di 2 " . .
njuffa,

2

IEEE 754 usa il segno / magnitudine, non il complemento a due o il complemento a uno.

Il complemento a due ha lo svantaggio che l'intervallo positivo e negativo non sono identici. Se tutti i bit pattern sono validi, allora hai numeri x in cui non puoi calcolare facilmente -x. Questo è male. L'alternativa è che ci sono modelli di bit non validi, il che è anche negativo. In IEEE 754 non esistono schemi di bit non validi per virgola mobile a 64 o 32 bit, quindi non è necessario preoccuparsene.

Un complemento renderebbe il moltiplicare / dividere più complesso (con magnitudine firmata, basta xor i segni e trattare la mantissa come un numero senza segno). Per aggiungere e sottrarre, non voglio davvero pensare ad aggiungere e sottrarre nel proprio complemento, mi fa male alla testa.


Il primo paragrafo di questa risposta suggerisce che non ci sono svantaggi per firmare / magnitudo. Il segno / magnitudine ha +/- 0 e un'aritmetica più complicata del complemento a due.
Prassolitico

Avere +/- zero è sia un problema che una caratteristica. Ad esempio, dividendo un numero piccolo x per 10 ^ 100 si otterrà +0 o -0, preservando il segno di x.
gnasher729,

1

La presenza di zeri con segno offre una maggiore espressività che può essere utile nei calcoli numerici. La pagina di Wikipedia " Firmato zero " dice:

Si afferma che l'inclusione dello zero con segno nell'IEEE 754 rende molto più semplice ottenere l'accuratezza numerica in alcuni problemi critici , in particolare quando si calcola con funzioni elementari complesse .

Uno dei principali progettisti di IEEE 754 in virgola mobile, WH Kahan è un sostenitore del segno zero per questi motivi. La sua opinione avrà probabilmente avuto molto peso.


1

Penso che sia importante capire che i calcoli in virgola mobile producono valori approssimativi , non valori esatti . Cioè, se un calcolo in virgola mobile produce un valore codificato X, ciò rappresenta un valore teoricamente ideale che è quasi certamente NON X, ma è compreso nell'intervallo [X .. X + e) ​​{dove 'e' è il ' machine epsilon ', ovvero non esiste un numero in virgola mobile tra X e X + e}. Più specificamente, uno zero in virgola mobile rappresenta un numero ideale che probabilmente non è esattamente zero, ma che è troppo piccolo per rappresentare con un valore codificato in virgola mobile diverso da zero.

Dato che, usare la rappresentazione di segno e magnitudine è un modo per consentire alla codifica di "ricordare" esattamente su quale lato dello zero si trova il valore ideale, il positivo o il negativo. Ciò è fondamentale in alcuni calcoli complessi (nel senso "a + bi") - le funzioni complesse> complesse sono spesso "multivalore", quindi per un corretto calcolo è fondamentale prestare attenzione alle posizioni dei "tagli di diramazione". Gli zeri firmati quindi in un certo senso segnano le posizioni di questi tagli del ramo - il calcolo fatto sul lato positivo sarà diverso da quello sul lato negativo.


1
I calcoli in virgola mobile producono valori esatti . Sono solo leggermente diversi dai valori che i numeri reali matematici producono. Un numero in virgola mobile rappresenta un numero, non un intervallo.
gnasher729,

0

La maggior parte dei formati a virgola mobile traggono vantaggio dal fatto che, in un sistema binario, qualsiasi valore diverso da zero con un esponente non minimo avrà un "1" come bit più significativo della mantissa. Pertanto, in un sistema con un campo a 23 bit per la mantissa, le mantisse di numeri positivi non vanno da 0 a 8.388.607 ma invece da 8.388.608 a 16.777.215. Le mantisse di numeri che possono essere o meno positivi vanno da -16.777.215 a -8.388.608 e da +8.388.608 a +16.777.215. Mentre il complemento a due è il miglior formato numerico quando è necessario che i calcoli attraversino lo "zero" senza intoppi, gli intervalli discontinui di valori di mantissa indicano che i calcoli non sarebbero in grado di operare senza intoppi sullo zero se usano il complemento a due o qualcos'altro .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.