2009-03-06 18 views
7

Stavo usando gdb per stampare un valore di un doppio e con mia sorpresa ha stampato -0C: Che cosa significa per un doppio essere == -0?

Che cosa è un doppio di valore -0 in C?

Tra l'altro quando ho controllato è l'uguaglianza con 0 tornò vero: Per fare il confronto ho appena fatto la seguente

in gdb

> print some_double 
-0 
> print some_double == 0 
1 

risposta

16

Negative zero è un concetto utile per calcolo numerico ed è un numero in virgola mobile valido in C.

3

Questo è un problema ben noto con printf. Dato che stai usando un numero in virgola mobile, non esiste una rappresentazione possibile in binario. E la maggior parte delle volte la rappresentazione binaria non è perfetta. Quindi 0 viene memorizzato come 0.00000000000000...0042 a volte e come -0.000000000000000000000123. Quando printf stampa il secondo, ottieni lo strano -0.

Non so davvero come si stia confrontando con 0, basta ricordare di aggiungere un epsilon quando si effettuano confronti a virgola mobile per regolare le stranezze. E.g: per verificare se due float sono uguali non scrivere mai a == b ma fabs(a-b) < 1e-13 dove 1e-13 è l'epsilon (scegli un esponente adatto a te).

+0

ho aggiunto come ho fatto il paragone – hhafez

+0

pensi che gdb è printf per le sue dichiarazioni di stampa? – hhafez

+0

sì, tutti quei programmi usano la stessa libc. – dirkgently

2

In realtà, leggendo il libro "Scrivere grande codice, Volume 1" nel Capitolo 4, l'autore dà la risposta abbastanza chiaramente a causa dell'uso del complemento 1 per rappresentare il float firmato nello standard IEEE FP. Dice:

La mantissa usa il formato complemento a uno piuttosto che il complemento a due. Ciò significa che il valore a 24 bit della mantissa è semplicemente un numero binario senza segno e il bit di segno, nella posizione 31 del bit, determina se tale valore è positivo o negativo. I numeri di complemento di uno hanno la proprietà insolita che ci sono due rappresentazioni per zero (con il bit di segno impostato o chiaro). Generalmente, questo è importante solo per la persona che progetta il software in virgola mobile o il sistema hardware.

enfasi è mia

+0

IEEE virgola mobile utilizza il segno e il valore (e l'esponente), non il complemento di uno. (Inoltre, la frazione è un significato e non una mantissa.) –

Problemi correlati