根据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
吗?这些类/结构是标准的还是非标准的?
答案 0 :(得分:7)
C ++没有指定float
必须是32位,或double
必须是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
,而后者可能就是您想要的。
答案 1 :(得分:7)
除了32位float
和64位double
之外,GCC还提供__float80
,__float128
,_Decimal32
,_Decimal64
,_Decimal128
;对于ARM目标,它还提供半精度__fp16
。
英特尔CPU使用旧的标量x87 FPU指令支持硬件中的80位浮点数(但不支持SSE向量指令)。我不知道任何主流CPU都支持十进制FP类型的硬件。
看起来当前的Microsoft编译器为double
和long 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 ++不提供小数类型;唯一的浮点类型是float
,double
和long 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详情)。它还支持可配置的字节序。