长双和双

时间:2010-08-11 00:55:37

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

我知道各种数据类型的大小可能会根据我所使用的系统而改变。 我使用XP 32位,并在C ++中使用sizeof()运算符,似乎long double是12个字节,double是8。

然而,大多数主要消息来源都表示long double是8个字节,因此范围与double相同。

为什么我有12个字节?如果long double确实是12个字节,那么这也不会扩展值的范围吗?或者,当值超出double的范围时,只使用长签名(编译器数字),因此,超出8个字节?

谢谢。

4 个答案:

答案 0 :(得分:58)

引自Wikipedia

  

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

  

编译器也可以使用long double作为128位四倍精度格式,目前在软件中实现。

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

就我的编程新手体验提示:

  • 使用periodicaly normalized float [-1.0,+ 1.0]

  • 使用double或long double

  • 分别保持标准化值
  • 归一化引入噪声=小错误=高频率 变量值

  • 有时用中值保持标准化是有用的 单独保存数据(原始数据顺序可以保存 作为置换矢量)