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

时间:2012-02-16 17:57:11

标签: c++ floating-point decimal

根据IEEE 754-2008,有

  

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

这张图表在它下面。在C ++中,我相信floatdouble是单精度和双精度(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

我可以为decimalX使用哪个类/结构,我可以将其用于binary128吗?这些类/结构是标准的还是非标准的?

5 个答案:

答案 0 :(得分:7)

C ++没有指定float必须是32位,或double必须是64位。它甚至不需要在一个字节中有8位(尽管必须至少 8)。

  

[C++11: 3.9.1/8]:有三种浮点类型:floatdoublelong double类型double至少提供与float一样多的精度,类型long double提供的精度至少与double一样精确。该集合类型float的值是double类型的值集的子集;类型double的值集是类型long double的值集的子集。 浮点类型的值表示是实现定义的。积分和浮动类型统称为算术类型。标准模板std::numeric_limits(18.3)的特化应指定实现的每种算术类型的最大值和最小值。

请参阅工具链和平台的文档,了解其类型大小。它可能支持long double,而后者可能就是您想要的。

答案 1 :(得分:7)

除了32位float和64位double之外,GCC还提供__float80__float128_Decimal32_Decimal64_Decimal128;对于ARM目标,它还提供半精度__fp16

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

看起来当前的Microsoft编译器为doublelong double提供了64位,但较旧的编译器为long double提供了80位。

请参阅此处的文档:

答案 2 :(得分:6)

英特尔拥有decimal floating-point library,可与Mac,Linux,HP / UX或Solaris上的ICC或GCC配合使用;或Windows上的ICC或CL编译器。它没有在内置类型上使用运算符那么有用。如果你正在使用C ++,也许有人已经编写了有用的类来覆盖所有必要的操作符。

答案 3 :(得分:5)

C ++不提供小数类型;唯一的浮点类型是floatdoublelong double

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

答案 4 :(得分:1)

如果您想要内置操作员的便利,但又不想自己编写,我建议您查看Bloomberg Finance's open-source C++ libraries on GitHub。特别是,BDE包中包含IEEE 754"十进制32/64/128"实施(见bdldfp_decimal.h)

这个库的优点是它支持多种不同的IEEE 754后端实现,包括C99参考实现,GCC附带的decNumber实现,以及Intel的开源IntelDFP库(参见{{3详情)。它还支持可配置的字节序。