2010-06-29 20 views
21

Czy minus zero (-0) odpowiada zero (0) w C#?Czy minus zero (-0) odpowiada zero (0) w C#

+14

Wygląda jak coś można z łatwością badanego siebie. –

+3

Chciałem tylko sprawdzić, czy są jakieś nieznane niewiadome - jeśli wiesz o co mi chodzi? – Ben

+1

@Evan - wyraźnie testując, czy 0 == -0 jest trywialne, i rzeczywiście wykonałem tę kontrolę przed wysłaniem. Zwróć uwagę na moje słowo "odpowiednik". Szukałem dyskusji wokół pytania, które wszyscy otrzymaliśmy. W szczególności dzięki Lucero. – Ben

Odpowiedz

27

Dla liczb całkowitych, nie ma binarna reprezentacja sprawia, że ​​różnica między 0 i -0, więc są one z definicji równe.

Dla liczb zmiennoprzecinkowych IEEE rozróżnia się zero ujemne i dodatnie. Zrobiłem kilka testów (CLR systemu .NET Framework 2.0, C# 3) i wydaje się, że są one uważane za równe, co w rzeczywistości jest zachowaniem oczekiwanym zgodnie ze standardem IEEE 754.

Oto mój kod test, aby pokazać, że:

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

Powroty:

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

'double negativeZero = -0.0' również daje takie same wyniki, co oznacza, że ​​stała' -0.0' jest poprawnie przetwarzana na wartość "ujemnego zera" podwójnego. – Lucero

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

a co powiesz na float i double? czy to wciąż jest dla nich prawdziwe? – Arseny

+4

@Arseny: Pytanie dotyczyło w szczególności -0 i 0 :) –

+2

To jest słaba odpowiedź na słabe pytanie. Oczywiście '0 == -0' dla liczb całkowitych, ale nie oznacza to, że są one" równoważne ". – Kobi

10

Dla dziesiętne, istnieją co najmniej 4 rodzaje zer:

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

Choć wszystkie są równe i wydrukowane jako "0", mają inną reprezentację bitową:

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

Źródło: Decimal Negative Zero Representation

+7

+1 - ale: twoje binarne 'negativeZero1' i' negativeZero3' wyglądają dla mnie prawie tak samo? – Lucero

Powiązane problemy