在 x86-64 下,FP 算术是用 SSE 完成的,因此 long double 是 64 位。
这通常在 x86-64 下发生(保证存在 SSE 指令),但程序仍然可以自由使用 x87,当您使用long double
.
您可以通过g++
在 Linux 上编译这样的程序来确认这一点:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
std::srand(std::time(NULL));
float f1=rand(), f2=rand();
double d1=rand(), d2=rand();
long double l1=rand(), l2=rand();
std::cout<<f1*f2<<" "<<d1*d2<<" "<<l1*l2<<std::endl;
return 0;
}
在汇编输出中,我找到mulsd xmm1, xmm0
了double
产品和mulss xmm0, xmm2
产品float
(都是 SSE 指令),但fmulp st(1), st
(x87 指令)是long double
产品。
因此,可以确认,编译器尽可能使用 SSE,但仍允许通过旧的 x87 指令集进行 80 位精度计算。
请注意,这是特定于编译器的 - 一些编译器(例如 VC++)总是忽略 80 位精度类型,只是将long double
其视为double
.
另一方面,由于 x86-64 System V ABI(在 Linux 上采用)要求long double
80 位,编译器使用该类型的所有可用精度执行计算的唯一方法是使用 x87 指令。