什么是x86-64上的long double?
有人告诉我:
在x86-64下,FP算法是通过SSE完成的,因此long double是64位。
但是在x86-64 ABI中它表示:
C type | sizeof | alignment | AMD64 Architecturelong double | 16 | 16 | 80-bit extended (IEEE-754)
参见:amd64-abi.pdf
和gcc说sizeof(long double)
是16并给出FLT_DBL
= 1.79769e+308
和FLT_LDBL =
1.18973e+4932
所以我很困惑,long double
64位怎么样?我认为这是一个80位的表示形式。
回答:
在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指令。
以上是 什么是x86-64上的long double? 的全部内容, 来源链接: utcz.com/qa/422962.html