比 float 或 double 更精确的数据类型?

问题描述 投票: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

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

  • __float128
     适用于 IEEE-754 二进制 128,
    __float80
     适用于 
    80 位扩展精度,
  • __ibm128
     用于 PowerPC 上的 
    双双算术
  • _Float128
    /
    _Float64x
    ,
  • 还有十进制浮点数
  • _Decimal32
    /
    _Decimal64
    /
    _Decimal128
在 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.