【问题标题】:Difference between long double and double in C and C++ [duplicate]C和C ++中long double和double之间的区别[重复]
【发布时间】:2013-01-08 18:26:10
【问题描述】:

可能重复:
long double vs double

我是编程新手,我无法理解 C 和 C++ 中 long double 和 double 之间的区别。我试图谷歌它,但无法理解它并感到困惑。有人可以帮忙吗?

【问题讨论】:

  • 我希望这取决于您的编译器。你看过文档吗?
  • 我的编译器是 gcc-4.3.4
  • 区别在于大小。它们可能相同,或者 long double 可能更大。更大意味着它可以容纳更大(和更小)的值并具有更高的精度。
  • 不同之处在于,任何带有 long 的类型都比没有 long 的类型本身更精确,范围也更大,因为它使用了更多的字节。
  • @Kevin 不完全正确 - 它可能更精确和/或范围更大,但不能保证。例如,已经和/或存在long int == int 的平台/编译器...

标签: c++ c long-double


【解决方案1】:

引用 C++ 标准,§3.9.1 ¶8:

共有三种浮点类型:float、double 和 long double。 double 类型提供的精度至少与 float 一样,long double 类型提供的精度至少与 double 一样。 float 类型的值集是 double 类型的值集的子集; double 类型的值集是 long double 类型的值集的子集。浮点类型的值表示是实现定义的。整数和浮点类型统称为算术类型。标准模板 std::numeric_limits (18.3) 的特化应指定实现的每种算术类型的最大值和最小值。

也就是说,double 占用的内存至少与floatlong double 一样多,至少与double 一样多。额外的内存用于更精确地表示数字。

在 x86 系统上,float 通常有 4 个字节长,可以存储大约 3×10³⁸ 和 1.4×10⁻⁴⁵ 的数字。它是一个 IEEE 754 single-precision number,存储大约 7 个小数位的小数。

同样在 x86 系统上,double 有 8 个字节长,可以在 IEEE 754 double-precision format 中存储数字,它的范围更大,存储的数字更精确,大约 15 个十进制数字。在其他一些平台上,double 可能不是 8 字节长,并且可能确实与单精度 float 相同。

标准只要求long double 至少与double 一样精确,因此一些编译器会简单地将long double 视为与double 相同。但是,在大多数 x86 芯片上,10 字节 extended precision format 80 位数字可通过 CPU 的浮点单元获得,它提供比 64 位 double 更高的精度,精度约为 21 位十进制数字。

一些编译器支持 16 字节(128 位)IEEE 754 quadruple precision number format,但表示形式更精确,范围更大。

【讨论】:

  • 所以在实践中,MSVC++ 2017,截至 2021 年,仍然有 sizeof(long double) 评估为与 sizeof(double) 相同的值:8 字节,无论是 32 位还是 64 位。 (docs.microsoft.com/en-us/previous-versions/…)
  • GCC 和 Clang 都为 Linux 上的 long double 提供 16 个字节,而 ARM 上的 GCC 提供 8 个字节。是的,仍然非常依赖于平台。
【解决方案2】:

这取决于您的编译器,但以下代码可以显示每种类型所需的字节数:

int main() { 
    printf("%d\n", sizeof(double)); // some compilers print 8
    printf("%d\n", sizeof(long double)); // some compilers print 16
    return 0;
}

【讨论】:

    【解决方案3】:

    long <type> 数据类型可能拥有比 <type> 数据类型更大的值,具体取决于编译器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 2012-08-26
      相关资源
      最近更新 更多