Как использовать десятичную (с плавающей точкой) в C ++? - PullRequest
5 голосов
/ 16 февраля 2012

Согласно IEEE 754-2008 существует

Существует три двоичных базовых формата с плавающей запятой (которые можно кодировать с использованием 32, 64 или 128 бит) и двадесятичные базовые форматы с плавающей точкой (которые могут быть закодированы с использованием 64 или 128 бит).

Эта диаграмма находится под ней.В C ++ я считаю float и double одинарной и двойной точности (binary32 и binary64).

Name        Common name         Base  Digits E min  E max   Digits  E max
binary32    Single precision    2     23+1   −126   +127    7.22    38.23
binary64    Double precision    2     52+1   −1022  +1023   15.95   307.95
binary128   Quadruple precision 2     112+1  -16382 +16383  34.02   4931.77
decimal32                       10    7      −95    +96     7       96
decimal64                       10    16     −383   +384    16      384
decimal128                      10    34     −6143  +6144   34      6144

Какой класс / структуру я могу использовать для decimalX и есть ли что-тоЯ могу использовать для binary128?Являются ли эти классы / структуры стандартными или нестандартными?

Ответы [ 5 ]

7 голосов
/ 16 февраля 2012

В дополнение к 32-разрядным float и 64-разрядным double GCC предлагает __float80, __float128, _Decimal32, _Decimal64, _Decimal128;для целей ARM он также предлагает половинную точность __fp16.

. Процессоры Intel поддерживают 80-разрядные операции с плавающей запятой в аппаратном обеспечении, используя старые скалярные инструкции x87 FPU (но не с векторными инструкциями SSE).Я не знаю ни о каких основных процессорах с аппаратной поддержкой десятичных типов FP.

Похоже, что нынешний набор компиляторов Microsoft предоставляет 64-битные как для double, так и long double, но более старыедал вам 80-бит для long double.

См. документацию здесь:

7 голосов
/ 16 февраля 2012

C ++ не указывает, что float s должен быть 32-разрядным или double s должен быть 64-разрядным. Он даже не требует, чтобы в байте было 8 бит (хотя должно быть , по крайней мере, 8).

[C++11: 3.9.1/8]: Существует три типа с плавающей запятой: float, double и long double. Тип double обеспечивает, по крайней мере, такую ​​же точность, как float, а тип long double обеспечивает, по крайней мере, такую ​​же точность, как double. Набор значений типа float равен подмножество множества значений типа double; набор значений типа double является подмножеством набора значений типа long double. Представление значений типов с плавающей запятой определяется реализацией . Интегральные и плавающие типы вместе называются арифметическими типами. Специализации стандартного шаблона std::numeric_limits (18.3) должны определять максимальные и минимальные значения каждого арифметического типа для реализации.

См. Документацию для вашей цепочки инструментов и платформы, чтобы узнать, каковы ее размеры. Он может поддерживать long double, что, в свою очередь, может быть тем, что вы хотите.

6 голосов
/ 16 февраля 2012

Intel имеет десятичную библиотеку с плавающей точкой , которая будет работать с ICC или GCC на Mac, Linux, HP / UX или Solaris;или компиляторы ICC или CL в Windows.Это не так полезно, как использование операторов для встроенных типов.Если вы используете C ++, возможно, кто-то уже написал полезные классы, которые переопределяют все необходимые операторы для этого.

5 голосов
/ 16 февраля 2012

C ++ не предоставляет десятичные типы; единственными типами с плавающей запятой являются float, double и long double.

Также С ++ не указывает, что они используют представления IEEE754 или имеют какой-либо конкретный размер. Единственное требование состоит в том, что double обеспечивает, по крайней мере, такую ​​же точность, как float, и что long double обеспечивает, по крайней мере, такую ​​же точность, как double.

1 голос
/ 02 мая 2016

Если вы хотите удобство встроенных операторов, но не хотите писать сами, я бы порекомендовал проверить библиотеки C ++ с открытым исходным кодом Bloomberg Finance на GitHub .В частности, пакет BDE содержит реализацию стандарта IEEE 754 "Decimal 32/64/128" (см. bdldfp_decimal.h)

Приятная вещь об этой библиотекечто он поддерживает несколько различных реализаций бэкэнда IEEE 754, включая эталонную реализацию C99, реализацию decNumber, поставляемую с GCC, и библиотеку IntelDFP с открытым исходным кодом Intel (подробности см. bdldfp_decimalplatform.h ).Он также поддерживает настраиваемый порядок байтов.

...