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

时间:2013-11-05 07:36:32

标签: c++ c cmath

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

1 个答案:

答案 0 :(得分:12)

代表Fused Multiply Add的

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在评论中提出这个问题。

  • 一些流行的拱门如ARM and x86有一个循环fma指令,所以理论上一个arch优化的编译器/ stdlib可以使用它们。

    我不知道现实编译器是否已在进行此优化。

    对于X86上的整数,FMA已经可以使用LEA指令完成:我认为创新是它使用double的事实。