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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top