gpt4 book ai didi

c - x86-64 上的 long double 是什么?

转载 作者:IT王子 更新时间:2023-10-29 00:24:46 26 4
gpt4 key购买 nike

有人告诉我:

Under x86-64, FP arithmetic is done with SSE, and therefore long double is 64 bits.

但是在 x86-64 ABI 中它说:

<表类="s-表"><头>C型大小对齐AMD64架构<正文>长双161680 位扩展 (IEEE-754)

参见:amd64-abi.pdf

gcc 说 sizeof(long double) 是 16 并给出 FLT_DBL = 1.79769e+308FLT_LDBL = 1.18973e +4932

所以我很困惑,long double 是 64 位的吗?我认为这是一个 80 位表示。

最佳答案

Under x86-64, FP arithmetic is done with SSE, and therefore long double is 64 bits.

这就是 x86-64 下通常发生的情况(保证存在 SSE 指令),但该程序仍然可以自由使用 x87,编译器可以在您使用 long double.

您可以通过在 Linux 上使用 g++ 编译这样的程序来确认这一点:

#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;
}

在程序集输出中,我找到 double 产品的 mulsd xmm1, xmm0float 的 mulss xmm0, xmm2 乘积(均为 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指令。

关于c - x86-64 上的 long double 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15176290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com