|
2. 使用 std::fma()(Fused Multiply-Add, FMA)
如果你的 CPU 支持 FMA(Intel AVX2 及以上),可以用 std::fma() 进行更精准的计算:
cpp
Copy
Edit
#include <cmath> // 需要 C++11 以上
double CommonMathUtil::ddot(int n, const double x[], const double y[])
{
double dot = 0.;
if (nullptr == x || nullptr == y)
{
return dot;
}
if (n < 1)
return 0.;
for (int i = 0; i < n; i++) {
dot = std::fma(x[i], y[i], dot); // 直接计算 x[i] * y[i] + dot,避免中间值丢失
}
return dot;
}
🔹 优势
std::fma(a, b, c) 不会单独计算 a*b 后再加 c,而是直接计算 (a*b) + c,减少舍入误差。
速度更快:现代 CPU 直接支持 FMA 指令,比 + 和 * 分开计算更快。 |
|