Почему .NET не определяет меньшие десятичные типы? - PullRequest
2 голосов
/ 22 марта 2012

Таким образом, я (кажется, я) понимаю разницу между Float, Double и Decimal , но одна вещь, которая меня интересует, заключается в том, почему существует два размера с плавающей двоичной точкой, но только один размер с плавающей запятой?

Если я правильно понимаю общий принцип, вы захотите использовать число с плавающей запятой (32-разрядное) для повышения производительности по сравнению с двойным (64-разрядное) на 32-разрядном процессоре, если вам не нужен дополнительный размер двойника. На 64-битном процессоре удвоение должно быть более производительным, поэтому такое обоснование не является необходимым. Но десятичный тип 128-битный. Так почему бы не предложить 64-разрядное десятичное число или даже 32-разрядное?

Это просто вопрос вариантов использования; это никому не нужно? Или есть техническая причина, например, что вы не можете точно представить полезные десятичные диапазоны с длиной менее 128 бит?

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Обязательная ссылка на функции Эрика Липперта начинается с невыполнения и реализуется только тогда, когда люди тратят усилия на их реализацию .

Почему это не будет хорошей идеей:

  • любой дополнительный числовой тип требует большого количества преобразований из / в другие числовые типы, а также правила, для которых разрешены, а какие нет.
  • меньшие типы (особенно 32-битные) просто не имели бы полезного диапазона - т. Е. Разумный ценовой диапазон элемента составляет не менее 8 цифр 12345,67 (0 десятая самой низкой денежной единицы).
1 голос
/ 23 марта 2012

почему существует два размера плавающей двоичной точки

Поскольку многие языки программирования уже имели отдельные типы с плавающей точкой одинарной и двойной точности, включая C (++), Java и Visual Basic. Естественно, что в C ++ / CLI, J # и VB.NET тоже есть эти типы.

OTOH, не было причин обратной совместимости иметь несколько десятичных типов с плавающей запятой.

Если я правильно понимаю общий принцип, вы захотите использовать float (32-разрядная версия) для повышения производительности по сравнению с двойной (64-разрядной) на 32-разрядной версии процессор, если вам не нужен дополнительный размер двойного.

Нет. Несмотря на название, double долгое время был «основным» типом с плавающей запятой, а float - типом «половинной точности», используемым для оптимизации памяти. Например, класс .NET System.Math почти всегда использует double вместо float. И что во всех языках, производных от C, литералы типа 1.23 имеют тип double (вам нужен дополнительный f, чтобы получить float).

Так почему бы не предложить 64-разрядное десятичное число или даже 32-разрядное?

При 32-битном (вероятно, 7-значном) decimal вы будете постоянно сталкиваться с ошибками округления. Теперь могут возникнуть ситуации, когда вы намеренно хотите пожертвовать точностью ради эффективности, но в этом случае вы также можете использовать float, чтобы получить преимущество аппаратной поддержки.

1 голос
/ 22 марта 2012

Меньший десятичный тип будет менее способным.Поскольку вы не склонны выполнять тот же тип вычислений большого объема, который характерен для данных с плавающей запятой, кажется, что нет необходимости в меньшем десятичном числе по соображениям производительности.

...