x87 все еще существует в x86-64, и 64-разрядные ядра для основных операционных систем правильно сохраняют / восстанавливают состояние x87 для 64-разрядных процессов.Несмотря на то, что вы, возможно, прочитали, x87 полностью применим в 64-битном коде.
Вне Windows (т. Е. X86-64 System V ABI, который используется везде), long double
- это 80-битный собственный x87родной формат.Это, вероятно, решит вашу проблему точности только для x86 / x86-64, если вы не заботитесь о переносимости в ARM / PowerPC / что-то еще, что имеет только 64-битную точность в HW.
Вероятно, лучше всего толькоиспользуйте long double
для временных значений внутри функции.
Я не уверен, что вам нужно делать в Windows, чтобы получить компилятор для генерации 80-битной расширенной математики FP.Это, конечно, возможно в asm и поддерживается ядром, но набор инструментов и ABI делают его неудобным для использования.
x87 только несколько медленнее, чем скалярная математика SSE на современных процессорах.Однако 80-битная загрузка / хранение выполняется слишком медленно, например, 4 мопа на Skylake вместо 1 (https://agner.org/optimize/) и несколько циклов дополнительной задержки для fld m80
.
Для цикла, в котором необходимо преобразоватьint в FP, сохраняя и используя x87 fild
, это может быть примерно в 2 раза медленнее, чем то, что хороший компилятор может сделать с SSE2 для 64-битного двойного.
И, конечно, long double
предотвратит авто-векторизацию.