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

标签 c++ c cmath

cmath 库中是否有函数给定 3 个数字 xyz 返回 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/

相关文章:

c++ - 无法再正确读取文本文件

c++ - 字符串对应的接入号

c - unistd.h中 `sleep`和 `pause`库函数的区别

c++ - 将很多符号表达式从 x^2 或 x^3 转换为 pow(x,n)

c++ - 如何在不包含 cmath 库的情况下使用 pow

c++ - 使用 FLTK 时出现 cmath 错误

c++ - 具有与实例一样多的参数的可变参数模板

c - 我在查看 <unistd.h> 中定义的 read() 函数代码时遇到了麻烦

使用 Zlib 将数据压缩成 block

C++:静态成员函数和变量——静态变量的重新定义?