Почему тип данных Decimal
имеет поле Epsilon
?
Из руководства диапазон значений Decimal
составляет ± 1.0 × 10e-28 до ± 7.9 × 10e28.
Представляет наименьшее положительное значение
Double
больше нуля
Итак, похоже, Decimal
имеет такое (нетривиальное) значение. Но почему он не легко доступен?
Я понимаю, что +1.0 × 10e-28 - это наименьшее положительное десятичное значение, большее нуля:
decimal Decimal_Epsilon = new decimal(1, 0, 0, false, 28); //1e-28m;
Кстати, есть несколько вопросов, которые дают информацию о внутреннем представлении типа десятичного типа:
- десятичное значение в недоразумении С#?
- Какое второе минимальное значение может представлять десятичное число?
Вот пример, когда Epsilon
был бы полезен.
Допустим, что у меня есть взвешенная сумма значений из некоторого набора выборки и суммы весов (или количества) взятых проб. Теперь я хочу вычислить средневзвешенное значение. Но я знаю, что сумма весов (или счет) может быть равна нулю. Чтобы предотвратить деление на ноль, я мог бы сделать if... else...
и проверить нуль. Или я мог бы написать вот так:
T weighted_mean = weighted_sum / (weighted_count + T.Epsilon)
Этот код короче в моих глазах. Или, альтернативно, я могу пропустить + T.Epsilon
и вместо этого инициализировать с помощью:
T weighted_count = T.Epsilon;
Я могу это сделать, когда знаю, что значения реальных весов никогда не близки к Epsilon
.
И для некоторых типов данных и прецедентов это, возможно, даже быстрее, поскольку в нем нет ветвей. Насколько я понимаю, процессоры не могут принимать обе ветки для вычисления, даже если ветки коротки. И я могу знать, что нули происходят случайным образом со скоростью 50%: =) Для Decima
l, аспект скорости, вероятно, не важен или даже положительно полезен в первом случае.
Мой код может быть общим (например, сгенерирован), и я не хочу писать отдельный код для десятичных знаков. Поэтому хотелось бы видеть, что Decimal
имеет аналогичный интерфейс, как и другие вещественные типы.