根据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
Run Code Online (Sandbox Code Playgroud)
decimalX我可以用什么类/结构,有什么我可以使用的binary128吗?这些类/结构是标准的还是非标准的?
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,而这可能是你想要的.
除了在32位float和64位double,GCC报价__float80,__float128,_Decimal32,_Decimal64,_Decimal128; 对于ARM目标,它还提供半精度__fp16.
英特尔CPU使用旧的标量x87 FPU指令支持硬件中的80位浮点数(但不支持SSE向量指令).我不知道任何主流CPU都支持十进制FP类型的硬件.
它看起来像微软编译器的当前作物提供64位两个double和long double,但旧的给你80位的long double.
请参阅此处的文档
C++不提供十进制类型; 唯一的浮点类型是float,double和long double.
C++也没有指定这些表示使用IEEE754表示,或者它们具有任何特定大小.唯一的要求是double提供至少与精度一样多的精度float,并且long double提供至少与精度一样多的精度double.