C++ 是否有比
float
或 double
更准确的数据类型,还是我只能接受我的计算将失败的事实?
编辑:正如李斯特先生所指出的,我的问题是关于精度。 当您将两个浮点数/双精度数相加时,与手动计算相比,数字减少了一半,这有点令人沮丧。
在某些编译器和某些体系结构中,“long double”将为您提供比 double 更高的精度。如果您使用的是 x86 平台,则 x87 FPU 具有“扩展”80 位浮点格式。当您使用“long double”类型时,Gcc 和 Borland 编译器会为您提供 80 位浮点值。请注意,Visual Studio 不支持此功能(MSVC 支持的最大为双精度,64 位)。
有一种叫做“double double”的东西,它是一种用于实现四精度 128 位浮点的软件技术。您可以找到实现它的库。
您还可以研究任意精度算术的库。
对于某些计算,64 位整数比 64 位浮点值是更好的选择。
但是,如果您的问题是关于常见平台上当前 C++ 编译器中的内置类型,那么答案是您仅限于 double(64 位浮点),并且在 64 位平台上您有 64 位整数。如果您可以坚持使用 x86 并使用正确的编译器,您还可以拥有 long double (80 位扩展精度)。
您可能对这个问题感兴趣:
当您将两个浮点数/双精度数相加时,与手工计算相比,数字减少了一半,这有点令人沮丧。
同样的事情也适用于任何其他类型。如果添加两个
int
并将其存储到 int
变量中,则无法获得正确的结果。如果添加两个没有扩展整数类型的 long long
值,情况会更糟。至少在最低有效位置仅损失了 1 位精度,并且在添加 2 个 float
或 double
时仍然保持精度。添加两个整数将删除最高有效位,因此您只能得到模结果,这在许多情况下是不需要的
也就是说,在标准 C++ 中你能拥有的最好的东西是 long double
if
LDBL_MANT_DIG > DBL_MANT_DIG
,否则你必须求助于非标准支持。例如
__float128
适用于 IEEE-754 二进制 128,
__float80
适用于80 位扩展精度,
__ibm128
用于 PowerPC 上的双双算术,
_Float128
/
_Float64x
,
_Decimal32
/
_Decimal64
/
_Decimal128
硬件支持
,
__float80
是最佳选择,默认情况下它映射到 long double
,除非您更改
-mlong-double-64/80/128
和
-m96/128bit-long-double
编译器标志。在 PowerPC 上,选项是
-mabi=ibmlongdouble/ieeelongdouble
。否则
__float128
或
_Decimal128
可能是合适的类型事实上,
C23 还为 _Decimal32/64/128
添加了可选支持
,所以我想不久之后它们就会被添加到 C++ 中。不过,到目前为止,您仍然可以用 C 语言编译一个小模块来使用这些新功能并从 C++ 进行调用。您仍然需要确保
FLT128_DIG > LDBL_DIG
并了解它们之间转换时的数基和精度的差异等。或者,如果性能并不重要,那么只需使用所有十进制浮点数