Под x86-64 Арифметика FP выполняется с помощью SSE, поэтому длинный двойной бит - 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, когда он может, но все же допускает вычисления с 80-битной точностью через старый набор команд x87.
Обратите внимание, что это компилятор конкретных - некоторые компиляторы (например, VC++) всегда игнорировали 80-битные типы точности и только обработанные long double
как синоним double
.
С другой стороны, поскольку система x86-64 V ABI (принятая в Linux) предусматривает, что long double
- это 80 бит, единственный способ для компилятора выполнить вычисления с использованием всей доступной точности этого типа - использовать x87.
Является ли этот «кто-то» более авторитетным, чем AMD64 ABI? Если нет, то каков ваш вопрос в точности? – Mat
@Mat: Кто-то прав в некотором роде? –
@user Что заставляет вас думать, что amd64 ABI ошибочен? –