为什么在我的 64 位机器上双精度和长双精度完全相同
Why are double and long double completely the same on my 64 bit machine?
这个问题听起来像是初学者,但是当我发现这个问题时,我认为我要么是初学者,要么我的comp缺少一些东西:
int main()
{
cout << sizeof(double) << endl;
cout << sizeof(long double) << endl;
cout << DBL_DIG << endl;
cout << LDBL_DIG << endl;
return 0;
}
程序输出:
8
8
15
15
我以为long double
是 10 个字节,有 18 个十进制数字,而double
是 8 个字节,有 15 位数字,但似乎我错了。
为什么会这样?
在 64 位计算机上使用 MSVC 2010。
在 MSVC++ 中,long double
是您所发现的double
的同义词。显然,这是为了利用仅限于64位操作的SSE/SSE2/SSE3指令集。
另请参阅此处了解更多信息。
所有基本类型的大小都是实现定义的,使用最低。 特别是,您所保证的只是double
它的精度和范围并不比float
低,而且long
double
的精度和范围也不比double
小。
从实现质量的角度来看,编译器应该给出您是硬件提供的最好的。 仅许多(大多数?(体系结构具有两种硬件支持的浮点类型;在这样的架构上, double
和long double
通常是相同的。 在一些架构,让这三者都相同可能是有意义的。 上英特尔,质量实现将有三种不同的类型,因为这就是硬件提供的(但实现仍然是即使所有三种浮点类型都相同,也符合(。 上另一方面,您可以为long double
:10争论不同的尺寸(从未见过(、12 (g++( 或 16 字节,出于对齐原因(带有一些未使用的字节数(。 英特尔的实现,其中long double
和 然而,double
相同只是质量差,而不是不符合要求。
相关文章:
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 为什么编译器接受具有长双精度文本的浮点数的初始化?
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 使用词法强制转换在'string to double'中设置双精度变量的精度
- 使用双精度运算的快速 SSE 低精度指数
- 如何将双精度类型的鼠标移动 x 和 y 从主机传递到 Qemu 中的虚拟机
- 获取长双精度向量的方差
- 查找大于双精度值的最小浮点数
- 浮点数和双精度之间的区别
- 避免双精度数字的四舍五入
- 由于C++中双精度类型的准确性而导致的错误
- 有没有办法将数字作为字符串,并在不使用浮点数或双精度数的情况下将其四舍五入到确切的位数
- 整数和双精度变量的初始化
- Xcode 错误:指针和双精度之间的比较
- 我可以控制调试器窗口中显示的浮点数和双精度变量的位数吗?
- 在我的数组中双精度之前的主要表达式
- 0.1 浮点数大于 0.1 双精度.我以为它是假的