C: Cosa significa per un doppio essere == -0?
Domanda
Stavo solo usando gdb per stampare il valore di un doppio e con mia sorpresa lo ha stampato -0
Che cos'è un doppio del valore di -0 in C?
A proposito, quando ho verificato che l'uguaglianza con 0 è tornata vera: per fare il confronto ho appena fatto quanto segue
in gdb
> print some_double
-0
> print some_double == 0
1
Soluzione
Zero negativo è un concetto utile per il calcolo numerico ed è un numero in virgola mobile valido in C.
Altri suggerimenti
Questo è un problema ben noto con printf
. Dal momento che si utilizza un numero in virgola mobile, non esiste una rappresentazione possibile in binario. E la maggior parte delle volte la rappresentazione binaria non è perfetta. Pertanto, 0 viene archiviato come 0.00000000000000...0042
a volte e come -0.000000000000000000000123
. Quando printf stampa il secondo, ottieni il -0 dispari.
Non so davvero come stai confrontando con 0, ricorda solo di aggiungere un epsilon quando fai confronti in virgola mobile per aggiustare le stranezze. Ad esempio: per verificare se due float sono uguali, non scrivere mai a == b
ma fabs(a-b) < 1e-13
dove 1e-13 è epsilon (scegli un esponente adatto a te).
In realtà leggendo il libro " Scrivere un ottimo codice, Volume 1 " nel capitolo 4 l'autore dà la risposta abbastanza chiaramente perché è l'uso del complemento di 1 per rappresentare il float firmato nello standard IEEE FP. Dice:
La mantissa usa un complemento <<>> # 8217; anziché due & # 8217; s complemento. Ciò significa che il valore a 24 bit della mantissa è semplicemente un numero binario senza segno e il bit di segno, nella posizione di bit 31, determina se quel valore è positivo o negativo. I numeri di complemento di & # 8217; hanno la proprietà insolita che ci sono due rappresentazioni per zero (con il bit di segno impostato o chiaro) . In generale, questo è importante solo per la persona che progetta il software o il sistema hardware in virgola mobile.
Il mio enfasi