如何在C++中使用decimal(float)?

5 c++ floating-point decimal

根据IEEE 754-2008,有

有三种二进制浮点基本格式(可使用32,64或128位编码)和两种十进制浮点基本格式(可使用64或128位编码).

这个图表在它下面.在C++中,我相信float并且double是单精度和双精度(binary32binary64).

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
Run Code Online (Sandbox Code Playgroud)

decimalX我可以用什么类/结构,有什么我可以使用的binary128吗?这些类/结构是标准的还是非标准的?

Lig*_*ica 7

C++没有指定floats必须是32位或doubles必须是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,而这可能是你想要的.


Rus*_*ove 7

除了在32位float和64位double,GCC报价__float80,__float128,_Decimal32,_Decimal64,_Decimal128; 对于ARM目标,它还提供半精度__fp16.

英特尔CPU使用旧的标量x87 FPU指令支持硬件中的80位浮点数(但不支持SSE向量指令).我不知道任何主流CPU都支持十进制FP类型的硬件.

它看起来像微软编译器的当前作物提供64位两个doublelong double,但旧的给你80位的long double.

请参阅此处的文档

  • 然而,OP似乎已经找到了有价值的具体信息.太惊人了,不是吗? (7认同)

mkb*_*mkb 6

英特尔有一个十进制浮点库,可与Mac,Linux,HP/UX或Solaris上的ICC或GCC配合使用; 或Windows上的ICC或CL编译器.它没有在内置类型上使用运算符那么有用.如果你正在使用C++,也许有人已经编写了有用的类来覆盖所有必要的操作符.


Mik*_*our 5

C++不提供十进制类型; 唯一的浮点类型是float,doublelong double.

C++也没有指定这些表示使用IEEE754表示,或者它们具有任何特定大小.唯一的要求是double提供至少与精度一样多的精度float,并且long double提供至少与精度一样多的精度double.