我知道各种数据类型的大小可能会根据我所使用的系统而改变。 我使用XP 32位,并在C ++中使用sizeof()运算符,似乎long double是12个字节,double是8。
然而,大多数主要消息来源都表示long double是8个字节,因此范围与double相同。
为什么我有12个字节?如果long double确实是12个字节,那么这也不会扩展值的范围吗?或者,当值超出double的范围时,只使用长签名(编译器数字),因此,超出8个字节?
谢谢。
答案 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 double
与double
相同。现代的x86 CPU确实支持这些16字节的双精度数据,因此我认为Clang和GCC正在做正确的事情,并允许您使用更高级别的语言原语访问更低级别的硬件功能。
答案 2 :(得分:3)
数字的标准字节大小是所有平台上保证的最小大小。它们在某些系统上可能更大,但它们永远不会更小。
答案 3 :(得分:1)
就我的编程新手体验提示:
使用periodicaly normalized float [-1.0,+ 1.0]
使用double或long double
归一化引入噪声=小错误=高频率 变量值
有时用中值保持标准化是有用的 单独保存数据(原始数据顺序可以保存 作为置换矢量)