cmath
库中是否有函数给定 3 个数字 x
、y
和 z
返回 x*y+z
?
最佳答案
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 and x86有一个周期的 fma 指令,所以理论上 arch 优化的编译器/标准库可以使用这些指令。
我不知道现代编译器在实践中是否已经在进行这种优化。
对于 X86 上的整数,FMA 已经可以使用 LEA 指令完成:我认为创新之处在于它使用了 double。
关于c++ - 一次加和乘 x*y+z 的 cmath 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19783879/