4

库中是否有cmath给出 3 个数字并返回x的函数?yzx*y+z

4

1 回答 1

12

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 指令,所以理论上拱门优化的编译器/标准库可以使用这些指令。

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

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

于 2013-11-05T07:45:50.177 回答