一次加法和乘法 x*y+z 的 cmath 函数



cmath库中是否有一个函数给出 3 个数字xyz 返回x*y+z

代表

融合乘法加法的fma在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在评论中提出它。

  • 一些流行的 arch,如 ARM 和 x86 有一个周期的 fma 指令,所以理论上一个 arch 优化的编译器/stdlibs 可以使用这些指令。

    我不知道在实践中现代编译器是否已经在进行这种优化。

    对于 X86 上的整数,FMA 已经可以使用 LEA 指令完成:我认为创新在于它使用了双精度。

最新更新