Come possono gli Unum emulare lo zero negativo di IEEE?

9

Attualmente sto leggendo "La fine dell'errore - Unum Computing" di John Gustafson ( Youtube ). Quello di cui non sono ancora sicuro è come i casi gestiti in IEEE da zero firmati negativamente vengano gestiti con gli unum.

Quindi, prima di tutto, gli unum permettono di rappresentare certi valori esatti (analogamente ai punti fluttuanti) e inoltre permettono di rappresentare gli intervalli aperti che si trovano tra i valori esatti (compresi i valori esatti -∞ e ∞). Quindi il completo la vera linea numerica è rappresentata dall'alternanza di valori precisi e intervalli aperti:

-∞, (-∞,-maxreal), -maxreal, ... -smallsubnormal, (-smallsubnormal,0),

0,

(0,smallsubnormal), smallsubnormal, ... maxreal, (maxreal,∞), ∞

In questo modo la (nella tradizione IEEE) valori eccezionali come underflow e overflow sono solo alcuni intervalli aperti. In altre parole: queste condizioni precedentemente speciali si trasformano in casi normali.

IEEE -∞ corrisponde all'unione di {-∞} e (-∞, -maxreal).

E lo zero firmato ora potrebbe essere gli intervalli (-smallsubnormal, 0) e (0, smallsubnormal).

Tuttavia, 1 / (- smallsubnormal, 0) è ora (-∞, -maxreal) e non -∞ da solo. Mentre 1/0 è ∞.

Quello che sto ancora esitando su questo è che in IEEE -0 e +0 sono uguali. Ma non lo fanno negli unum. Sembra che la mappatura non sia al 100%. Quindi mi chiedo se ci sono delle cornerstute in cui la differenza può mostrare ((e se questi casi sono davvero rilevanti)).

(Sono a conoscenza di Perché lo zero negativo è importante? , Utilizza per il valore in virgola mobile negativo )

    
posta false 23.06.2015 - 17:31
fonte

1 risposta

3

Un commento troppo lungo, quindi scrivilo come risposta ...

Il problema con IEEE è che abbiamo tre casi da distinguere, ma solo due rappresentazioni per questi:

  • valore negativo, valore assoluto troppo piccolo per rappresentare - questo è rappresentato da IEEE -0.0 e potrebbe essere facilmente mappato a (-smallsubnormal,0)
  • valore esattamente nullo, rappresentato da IEEE 0.0, mappato a 0
  • valore positivo troppo piccolo per rappresentare; questo ha la rappresentazione IEEE 0.0 pure ma dovrebbe essere mappato a (0, +smallsubnormal) .

Il problema ora è non lo zero negativo, ma non possiamo distinguere se un IEEE 0.0 è il secondo o il terzo caso! In altre parole: la funzione di mappatura da UNUM a IEEE è non biiettiva - e non lo sarà mai, come per qualsiasi altro valore IEEE, troppo, non sappiamo mai se è l'esatto o l'intervallo!

Quindi penso che sia assolutamente corretto mappare da -0.0 a (-smallsubnormal,0) , e dobbiamo decidere se IEEE 0.0 è piuttosto mappato a 0 o forse meglio a (0, +smallsubnormal) . Io personalmente tendo al primo, ma non è molto autorevole ...

Come per il confronto con IEEE (-0.0 uguale a 0.0): Uno dovrebbe (quasi) mai e poi mai confrontare per l'uguaglianza esatta (C o C ++: == operatore), ma solo per il valore assoluto della differenza è minore di alcuni soglia appropriata. Questo problema viene eliminato solo parzialmente con UNUMS, dato che ora può confrontare per l'uguaglianza esatta, se il bit u è non impostato, ma con esso viene impostato, noi ancora non lo so davvero ...

    
risposta data 12.01.2018 - 09:15
fonte

Leggi altre domande sui tag