2014-09-24 3 views
11

я впервые попробовал это (в vb.net)Почему оценивается "(Double.MinValue + 1)> Double.MinValue" на false?

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

но что оценивается как ложное. Затем я пробовал это

(Double.MinValue + 999999999999999999) > Double.MinValue 

, который также имеет значение false.

Почему?

+0

Теперь я нашел http://msdn.microsoft.com/de-de/library/system.double.epsilon%28v=vs.110%29.aspx: «Однако свойство Epsilon не является общей мерой точность двойного типа, применяется только к двойным экземплярам с нулевым значением или показателем -1022 ». – habakuk

ответ

15

Добавление очень маленького значения (величины) к очень большой (величине) делает: практически никакой разницы. В этом случае разница настолько мала, что не может быть изображена с точностью double. В основном:

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

Это не гарантирует, чтобы иметь возможность представлять каждую double между double.MinValue и double.MaxValue, и по мере увеличения величины, абсолютное разрешение, что может быть представлено уменьшается.

Не забывайте: double.MinValue имеет 308 цифр до десятичной точки. Вы меняете очень мало. Вы в основном делают:

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

Имейте в виду, что double имеет примерно 17 цифр точности; поэтому около 291 цифр этого огромного числа можно в значительной степени игнорировать.

+0

double.MinValue * 0.999999999999> double.MinValue должен работать, если вам нужен номер, который не так отрицателен, как double.MinValue. – gnasher729

+0

Я думаю, что это должно быть 'double.MinValue + most_things === most_things' – Mike

+0

@ Майк почему, точно? –

Смежные вопросы