2010-06-29 15 views
21

È meno zero (-0) equivalente a zero (0) in C#?È zero (-0) equivalente a zero (0) in C#

+14

Sembra come qualcosa che si potrebbe avere facilmente da sé testato. –

+3

Volevo solo verificare se ci fossero delle incognite sconosciute - se capisci cosa intendo? – Ben

+1

@Evan - test chiaramente se 0 == -0 è banale, e infatti ho eseguito questo controllo prima di postare. Nota la mia parola "equivalente". Stavo cercando la discussione intorno alla domanda, che tutti abbiamo avuto. Grazie a Lucero in particolare. – Ben

risposta

27

Per gli interi, non esiste alcuna rappresentazione binaria che faccia differenza tra 0 e -0, quindi sono per definizione uguali.

Per i numeri a virgola mobile IEEE, esiste una distinzione tra zero negativo e positivo. Ho effettuato alcuni test (CLR di .NET Framework 2.0, C# 3) e sembra che siano considerati uguali, il che è in realtà il comportamento previsto secondo lo standard IEEE 754.

Ecco il mio codice di prova per dimostrare che:

double minusOne = -1.0; 
    double positiveZero = 0.0; 
    double negativeZero = minusOne*positiveZero; 
    Console.WriteLine("{0} == {1} -> {2}", positiveZero, negativeZero, positiveZero == negativeZero); 
    Console.WriteLine("Binary representation is equal: {0}", BitConverter.DoubleToInt64Bits(positiveZero) == BitConverter.DoubleToInt64Bits(negativeZero)); 

Returns:

0 == 0 -> True 
Binary representation is equal: False 
+2

'double negativeZero = -0.0' restituisce gli stessi risultati, il che significa che la costante' -0.0' viene correttamente analizzata nel valore "zero negativo" di un doppio. – Lucero

2
if (-0 == 0) Console.WriteLine("YES, it is!"); 
+6

e che dire di float e double? è ancora vero per loro? – Arseny

+4

@Arseny: la domanda riguardava specificamente -0 e 0 :) –

+2

Questa è una risposta scarsa a una domanda scarsa. Ovviamente '0 == -0' per i numeri interi, ma non significa che siano" equivalenti ". – Kobi

10

per i decimali, ci sono almeno 4 tipi di zeri:

Decimal zero = Decimal.Zero; 
Decimal negativeZero1 = new Decimal(0, 0, 0, true, 0); 
Decimal negativeZero2 = -0.0m; 
Decimal negativeZero3 = Decimal.Negate(Decimal.Zero); 

Mentre tutti sono uguali e stampati come "0", hanno una rappresentazione bit diversa:

zero:   {0x00000000 00000000 00000000 00000000 } 
negativeZero1: {0x00000000 00000000 00000000 80000000 } 
negativeZero2: {0x00000000 00000000 00000000 80010000 } 
negativeZero3: {0x00000000 00000000 00000000 80000000 } 

Fonte: Decimal Negative Zero Representation

+7

+1 - ma: il tuo binario 'negativeZero1' e' negativeZero3' sembrano più o meno gli stessi per me? – Lucero

Problemi correlati