Почему десятичная дробь C # использует двоичное целочисленное значение?

Новый 128-битный десятичный тип с плавающей запятой IEEE https://en.wikipedia.org/wiki/Decimal128_floating-point_format указывает, что мантисса может быть представлена ​​одним из двух способов, либо как простое двоичное целое число, либо в плотно упакованном десятичном виде (в этом случае каждые десять бит представляют три десятичные цифры).

Тип decimal в C # предшествует этому стандарту, но имеет ту же идею. Он шел с двоичным целочисленным значащим.

На первый взгляд это кажется неэффективным; для сложения и вычитания, чтобы выровнять значения, вам нужно разделить одно из них в степени десяти; а деление - самый затратный из всех арифметических операторов.

Что послужило причиной выбора? Какое соответствующее преимущество было сочтено оправданным этого штрафа?


person rwallace    schedule 11.07.2020    source источник
comment
потому что это то, что написано? .NET 1 выпущен в начале 2002 года; для выбора могли быть определенные технические условия, или это могло быть полностью то, что соответствует предполагаемому поведению, и мы можем отгрузить в соответствии с графиком? - но: было бы амбициозно надеяться найти все причины на этом этапе   -  person Marc Gravell    schedule 11.07.2020
comment
Потому что это то, что Intel использует в модуле с плавающей запятой в микропроцессоре. См .: software.intel.com/content/www/us/en/develop/articles/   -  person jdweng    schedule 11.07.2020
comment
@jdweng В этой ссылке обсуждается программная библиотека с плавающей запятой. Я не вижу в нем ничего, что предполагало бы, что десятичные числа с плавающей запятой реализованы в оборудовании на процессорах Intel сегодня, не говоря уже о том, когда был изобретен C #?   -  person rwallace    schedule 11.07.2020
comment
Как вы думаете, где Intel использует библиотеку? См .: intel.com/content/dam/www/public/us/en/documents/case-studies/   -  person jdweng    schedule 11.07.2020
comment
@jdweng блоки с плавающей запятой на процессорах Intel являются двоичными, а не десятичными   -  person David Heffernan    schedule 11.07.2020


Ответы (1)


Выбор одного представления почти всегда сводится к компромиссу.

Из здесь

Двоичное кодирование по своей природе менее эффективно для преобразований в данные с десятичной кодировкой или из них, таких как строки (ASCII, Unicode и т. Д.) И BCD. Поэтому двоичное кодирование лучше всего выбирать только тогда, когда данные являются двоичными, а не десятичными. IBM опубликовала непроверенные данные о производительности.

Здесь вы можете узнать больше об относительной производительности.

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

person Patrick Beynio    schedule 11.07.2020