x86-64では、FP演算はSSEで行われるため、longdoubleは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;
}
アセンブリ出力では、製品と製品(両方のSSE命令)が見つかりmulsd xmm1, xmm0
ましたが、製品(x87命令)が見つかりました。double
mulss xmm0, xmm2
float
fmulp st(1), st
long double
したがって、コンパイラは可能な場合はSSEを使用しますが、古いx87命令セットを介して80ビットの精度の計算を許可することが確認されています。
これはコンパイラ固有であることに注意してください。一部のコンパイラ(VC ++など)は常に80ビットの精度の型を無視long double
し、の同義語として扱われdouble
ます。
一方、x86-64 System V ABI(Linuxで採用)long double
は80ビットを義務付けているため、コンパイラがこのタイプの利用可能なすべての精度を使用して計算を実行する唯一の方法は、x87命令を使用することです。