您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

什么是x86-64上的long double?

什么是x86-64上的long double?

在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, xmm0double产品和mulss xmm0, xmm2float产品(包括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指令。

其他 2022/1/1 18:16:17 有593人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶