2014-09-24 36 views
11

đầu tiên tôi đã cố gắng này (trong vb.net)Tại sao lại đánh giá "(Double.MinValue + 1)> Double.MinValue" thành false?

(Double.MinValue + Double.Epsilon) > Double.MinValue 

nhưng đó là false. Sau đó, tôi đã thử điều này

(Double.MinValue + 999999999999999999) > Double.MinValue 

cũng đánh giá sai.

Tại sao?

+0

Bây giờ tôi đã tìm thấy http://msdn.microsoft.com/de-de/library/system.double.epsilon%28v=vs.110%29.aspx: "Tuy nhiên, thuộc tính Epsilon không phải là thước đo chung của độ chính xác của loại Double; nó chỉ áp dụng cho các cá thể Đôi có giá trị bằng 0 hoặc số mũ là -1022. " – habakuk

Trả lời

15

Việc thêm một giá trị rất nhỏ (độ lớn) vào một độ lớn (độ lớn) làm cho: hầu như không có sự khác biệt. Trong trường hợp này, sự khác biệt quá nhỏ đến mức nó không thể được đại diện trong độ chính xác của double. Về cơ bản:

double.MinValue + (most things) === double.MinValue 

Nó không đảm bảo để có thể đại diện cho tất cả các đơn double giữa double.MinValuedouble.MaxValue, và khi bạn tăng độ lớn, độ phân giải tuyệt đối về những gì có thể được biểu giảm.

Đừng quên: double.MinValue308 chữ số trước vị trí thập phân. Bạn đang thay đổi rất ít trong số họ. Bạn về cơ bản thực hiện:

-179769313486232000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
000000000000000000000000000000000000000000000000000000 // yikes! 
+ 999999999999999999 

Hãy ghi nhớ rằng doublekhoảng 17 chữ số chính xác; khoảng 291 chữ số của con số khổng lồ đó có thể bị bỏ qua phần lớn.

+0

double.MinValue * 0.999999999999> double.MinValue sẽ hoạt động nếu bạn muốn một số không đủ âm như double.MinValue. – gnasher729

+0

Tôi nghĩ rằng nó phải là 'double.MinValue + most_things === most_things' – Mike

+0

@ Giống như thế nào, chính xác? –

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