Имеет ли двойной диапазон больше, чем длинный?
В статье о MSDN указано, что тип данных double
имеет диапазон "-1.79769313486232e308.. 1.79769313486232e308". В то время как тип данных long
имеет только "-9,223,372,036,854,775,808.. 9,223,372,036,854,775,807". Как double
может хранить гораздо больше данных, чем long
, если они имеют размер 64 бит?
http://msdn.microsoft.com/en-us/library/cs7y5x0x (v = vs .90).aspx
Ответы
Ответ 1
Число возможных удвоений и количество возможных длин одинаковы, они просто распределены по-разному *.
Длины равномерно распределены, а поплавков - нет. Вы можете прочитать здесь здесь.
Id пишите больше, но по какой-то причине курсор прыгает по всему месту на моем телефоне.
Изменить: это может быть полезно: http://en.m.wikipedia.org/wiki/Double-precision_floating-point_format#section_1
Edit2: и это еще лучше: http://blogs.msdn.com/b/dwayneneed/archive/2010/05/07/fun-with-floating-point.aspx
* Согласно этой ссылке, было бы видно, что на самом деле есть больше длин, так как некоторые удваиваются, теряются из-за того, что представлены NaNs и другие специальные числа.
Ответ 2
long
- это подписанное 64-битовое целочисленное значение, а double
- это 64-битное значение с плавающей запятой. Взгляд на их типы FCL может иметь больше смысла. long
отображается на System.Int64
и double
на System.Double
.
Ответ 3
Простой ответ заключается в том, что double
может быть точным только до 15-16 цифр, в отличие от long
, который (как целочисленный тип) имеет абсолютную точность в явном значении цифры, в этом случае 19 цифр. (Имейте в виду, что цифры и значения семантически отличаются.)
double
: -/+ 0,000,000,000,000,01 до +/- 99,999,999,999,999.9
(с точностью 100% с потерей точности, начиная с 16-й цифры, как представлено в "-1.79769313486232e308.. 1.79769313486232e308".)
long
: -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807
ulong
: от 0 до 18,446,744,073,709,551,615 (более чем длинный, но идентичный диапазон значений (поскольку он был сдвинут только для исключения отрицательных результатов).
В общем случае int-type действительные числа предпочтительнее значений с плавающей запятой , если вам явно не требуется десятичное представление (для любой цели).
Кроме того, вы можете знать, что подписанный предпочтительнее без знака, поскольку первый гораздо менее подвержен ошибкам (рассмотрим инструкцию uint i;
, затем i - x;
где x > i
).