cmath
库中是否有一个函数给出3个数字x
,y
和z
返回x*y+z
?
答案 0 :(得分:12)
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的事实。