Тип десятичной дроби в стандарте C # против стандарта IEEE-754 - PullRequest
1 голос
/ 31 января 2012

Десятичный тип в C # следует тем же правилам (формула, нормализованная / денормализованная, подразумеваемая 1, смещение экспоненты) классического двойного представления (стандарт IEEE-754), за исключением использования базы 10 вместо базы 2.

Что подразумевает использование базы 10 вместо базы 2?

Есть ли, как и в случае "двойного стандарта IEEE-754", такое же поведение, а именно некоторые промежутки между смежными значениями даже для конечной точности (например, 28/29 цифр)?

1 Ответ

3 голосов
/ 31 января 2012

Нет, C # decimal не следует тем же правилам, что и числа с плавающей точкой IEEE 754. Спецификация C # 4 совершенно ясно о том, как она должна вести себя (§4.1.7):

Тип decimal - это 128-битный тип данных, подходящий для финансовых и денежных расчетов. Десятичный тип может представлять значения в диапазоне от 1,0 × 10 -28 до приблизительно 7,9 × 10 28 с 28-29 значащими цифрами.

Конечный набор значений типа decimal имеет вид (–1) s × c × 10 - e , где знак s равен 0 или 1, коэффициент c равен 0 ≤ c <296, а шкала <em>e таков, что 0 ≤ e ≤ 28. Тип decimal не поддерживает нули со знаком, бесконечности или NaN. decimal представляется в виде 96-разрядного целого числа, масштабируемого степенью десяти. Для decimal s с абсолютным значением меньше 1.0m значение является точным с точностью до 28-го знака после запятой, но не дальше. Для decimal s с абсолютным значением, большим или равным 1.0m, значение является точным до 28 или 29 цифр. В отличие от типов данных float и double десятичные дробные числа, такие как 0,1, могут быть точно представлены в представлении decimal. В представлениях float и double такие числа часто представляют собой бесконечные дроби, что делает эти представления более склонными к ошибкам округления.

...