2010-06-29 51 views
21

Có phải là số không (-0) tương đương với số không (0) trong C# không?Có phải là số không (-0) tương đương với số không (0) trong C#

+14

Có vẻ như một cái gì đó bạn có thể có một cách dễ dàng thử nghiệm bản thân. –

+3

Tôi chỉ muốn kiểm tra xem có bất kỳ ẩn số chưa biết nào - nếu bạn biết ý tôi là gì? – Ben

+1

@Evan - kiểm tra rõ ràng liệu 0 == -0 có tầm thường không, và thực sự tôi đã thực hiện kiểm tra này trước khi đăng. Lưu ý từ "tương đương" của tôi. Tôi đang tìm kiếm cuộc thảo luận xung quanh câu hỏi, tất cả chúng ta đều có. Nhờ Lucero nói riêng. – Ben

Trả lời

27

Đối với các số nguyên, không có đại diện nhị phân nào tạo ra sự khác biệt giữa 0 và -0, vì vậy chúng theo định nghĩa bằng nhau.

Đối với các số dấu phẩy động IEEE, có sự khác biệt về số không âm và dương. Tôi đã thực hiện một số thử nghiệm (CLR của .NET Framework 2.0, C# 3) và có vẻ như chúng được coi là bình đẳng, đó thực sự là hành vi được mong đợi theo tiêu chuẩn IEEE 754.

Đây là mã thử nghiệm của tôi để chứng minh rằng:

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' cũng mang lại kết quả tương tự, có nghĩa là hằng số' -0.0' được phân tích cú pháp chính xác thành giá trị "số không âm" của giá trị gấp đôi. – Lucero

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

và về float và double thì sao? nó vẫn đúng cho họ sao? – Arseny

+4

@Arseny: Câu hỏi cụ thể về -0 và 0 :) –

+2

Đây là câu trả lời không tốt cho câu hỏi khó. Tất nhiên '0 == -0' cho số nguyên, nhưng nó không có nghĩa là chúng là" tương đương ". – Kobi

10

Đối thập phân, có ít nhất 4 loại số không:

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

Trong khi tất cả được bằng và được in ra dưới dạng "0", chúng có biểu diễn bit khác nhau:

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

Nguồn: Decimal Negative Zero Representation

+7

+1 - nhưng: nhị phân của bạn 'negativeZero1' và' negativeZero3' trông khá giống với tôi? – Lucero

Các vấn đề liên quan