Есть ли функция в cmath
библиотека которая дала 3 номера x
, y
а также z
возвращается x*y+z
?
fma
который расшифровывается как Fused Multiply Add, был представлен в C99 и C ++ 11:
#include <cassert>
#include <cmath>
int main() {
assert(std::fabs(std::fma(2.0, 3.0, 4.0) - (2.0 * 3.0 + 4.0)) < 0.001);
}
Возможные обоснования:
IEEE 754-2008 похоже, добавлена поддержка операции, требующая, чтобы она выполнялась с одним округлением вместо двух.
Спасибо @ Lưu за то, что подняли это в комментарии.
некоторые популярные арки, такие как ARM и x86 иметь один цикл fma инструкций, поэтому теоретически их могут использовать оптимизированные для арки компиляторы / stdlibs.
Я не знаю, если на практике современные компиляторы уже делают эту оптимизацию.
Для целых чисел в X86 FMA уже можно было выполнить с помощью инструкции LEA: я думаю, что новшеством является тот факт, что он использует double.
Других решений пока нет …