cmath функция, которая добавляет и умножает сразу x*y+z
Есть ли функция в cmath
библиотека которая дала 3 номера x
, y
а также z
возвращается x*y+z
?
1 ответ
Решение
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.