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.

Другие вопросы по тегам