Почему десятичная дробь C# использует двоичное целочисленное значение? - PullRequest
3 голосов
/ 11 июля 2020

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

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

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

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

1 Ответ

0 голосов
/ 11 июля 2020

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

От здесь

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

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

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

...