【问题标题】:long double vs double长双 vs 双
【发布时间】:2011-03-28 03:25:45
【问题描述】:

我知道各种数据类型的大小可能会根据我所在的系统而变化。

我使用 XP 32 位,在 C++ 中使用 sizeof() 运算符,看起来 long double 是 12 个字节,double 是 8 个字节。

但是,大多数主要来源都指出 long double 是 8 个字节,因此范围与 double 相同。

我怎么有 12 个字节?如果long double确实是12个字节,这不也扩展了值的范围吗?或者长签名仅在值超出双精度范围时使用(编译器数字),因此超出 8 个字节?

【问题讨论】:

  • 这是 ISO C 中最糟糕的功能。我强烈建议您不要使用它。它只会导致问题,因为规范太松散了。

标签: c++ floating-point long-double


【解决方案1】:

对于 x64 上的现代编译器,Clang 和 GCC 对 long double 使用 16 字节双精度,而 VC++ 使用 8 字节双精度。换句话说,使用 Clang 和 GCC,您可以获得更高的双精度,但对于 VC++,long doubledouble 相同。现代 x86 CPU 确实支持这些 16 字节双精度,因此我认为 Clang 和 GCC 做的是正确的事情,并允许您使用高级语言原语访问低级硬件功能。

【讨论】:

  • 大小为 16 字节,但其中 6 字节为填充。 long double 在默认情况下始终是 80 位扩展的,在 x86 和 x86-64 上分别填充到 12/16 字节。如果您愿意破坏 ABI 或某些 API,可以通过 -mlong-double-64/80/128 options 更改大小。还有-m96/128bit-long-double可以改变padding大小
【解决方案2】:

引用Wikipedia:

在 x86 架构上,大多数编译器将 long double 实现为该硬件支持的 80 位扩展精度类型(有时存储为 12 或 16 字节以维护数据结构。

编译器还可以将 long double 用于 128 位四倍精度格式,目前在软件中实现。

换句话说,是的,long double可能能够存储比double 更大范围的值。但这完全取决于编译器。

【讨论】:

  • 数据类型在很大程度上取决于您正在开发的架构。
  • @karlphillip, @greyfade:是的,我的意思是“由编译器决定”,因为它决定如何存储您的数据。显然它仅限于平台上可用的内容,当然编译器可以选择允许用户覆盖。
  • Apple 声称 long double 是 128 位:developer.apple.com/library/archive/documentation/Darwin/…
  • @AaronFranke 这是填充后的尺寸。真正的底层类型仍然是 80 位扩展的,但出于对齐原因,在 x86 上填充为 12 个字节,在 x86-64 上填充为 16 个字节。除了 MSVC 之外,几乎所有 x86 编译器都这样做。没有人将 IEEE-754 四倍精度用于 long double,因为这非常慢
  • @AaronFranke 也由 Unix(包括 Apple)使用的 x86-64 SysV ABI 指定。只需检查LDBL_MANT_DIG 并查看news.ycombinator.com/item?id=19237884
【解决方案3】:

数字的标准字节大小是所有平台上保证的最小大小。它们在某些系统上可能更大,但它们永远不会更小。

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多