2010-06-29 18 views
21

¿Tiene cero cero (-0) equivalente a cero (0) en C#?Es menos cero (-0) equivalente a cero (0) en C#

+14

parece como algo que podría fácilmente haber probado a sí mismo. –

+3

Solo quería comprobar si había incógnitas desconocidas, si sabes a qué me refiero? – Ben

+1

@Evan - probando claramente si 0 == -0 es trivial, y de hecho realicé esta comprobación antes de publicar. Tenga en cuenta mi palabra "equivalente". Estaba buscando la discusión sobre la pregunta, que todos obtuvimos. Gracias a Lucero en particular. – Ben

Respuesta

27

En el caso de los enteros, no hay una representación binaria que marque la diferencia entre 0 y -0, por lo que son por definición iguales.

Para los números de coma flotante IEEE, existe una distinción de cero negativo y positivo. Hice algunas pruebas (CLR de .NET Framework 2.0, C# 3) y parece que se consideran iguales, que en realidad es el comportamiento esperado de acuerdo con el estándar IEEE 754.

Aquí está mi código de prueba para demostrar que:

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)); 

Devuelve:

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

'double negativeZero = -0.0' también produce los mismos resultados, lo que significa que la constante' -0.0' se analiza correctamente en el valor de "cero negativo" de un doble. – Lucero

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

y ¿qué hay de float y double? ¿sigue siendo cierto para ellos? – Arseny

+4

@Arseny: La pregunta fue específicamente sobre -0 y 0 :) –

+2

Esta es una respuesta pobre a una pregunta pobre. Por supuesto '0 == -0' para enteros, pero eso no significa que sean" equivalentes ". – Kobi

10

para decimales, hay por lo menos 4 tipos de ceros:

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

Mientras que todos están iguales e impresos como "0", tienen una representación de bits diferente:

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

Fuente: Decimal Negative Zero Representation

+7

+1 - pero: su '' binario 'negativeZero1' y' negativeZero3' parecen bastante iguales para mí? – Lucero