比 float 或 double 更准确的数据类型? C++

问题描述 投票:0回答:2

C++ 是否有比 float 或 double 更准确的数据类型,或者我是否只需要接受我的计算将会失败的事实?

编辑:正如李斯特先生所指出的,我的问题是关于精度。 当您将两个浮点数/双精度数相加时,与手动计算相比,数字减少了一半,这有点令人沮丧。

c++ floating-point floating-accuracy decimal
2个回答
5
投票

在某些编译器和某些体系结构中,“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 位扩展精度)。

您可能对这个问题感兴趣:

long double(GCC 特定)和 __float128


0
投票

当您将两个浮点数/双精度数相加时,与手工计算相比,数字减少了一半,这有点令人沮丧。

同样的事情也适用于任何其他类型。如果添加两个

int
并将其存储到
int
变量中,则无法获得正确的结果。如果添加两个没有扩展整数类型的
long long
值,情况会更糟。至少在最低有效位置仅损失了 1 位精度,并且在添加 2 个
float
double
时仍然保持精度。添加两个整数将删除最高有效位,因此您只能得到模结果,这在许多情况下是不需要的

也就是说,在标准 C++ 中可以拥有的最好的东西是

long double
,否则你必须求助于非标准支持。
例如 gcc 和其他一些编译器有各种浮点扩展:

在 x86(以及 Motorola 6888x 和 Intel i960)上,由于

硬件支持
__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
并了解它们之间转换时的数基和精度的差异等。或者,如果性能并不重要,那么只需使用所有十进制浮点数

© www.soinside.com 2019 - 2024. All rights reserved.