我在以下代码示例中遇到数字错误:
#include <iostream>
#include <random>
#include <vector>
int main()
{
std::random_device rd;
std::mt19937 g{ rd() };
std::uniform_real_distribution<> u;
static std::size_t constexpr n = 1000;
std::vector<double> q(n);
std::generate_n(q.begin(), q.size(), [&]() { return u(g); });
double average_of_q{};
for (auto const& q : q)
average_of_q += q;
average_of_q /= n;
std::vector<double> f(n);
std::generate_n(f.begin(), n, [&]() { return u(g); });
double sum1{};
for (std::size_t i = 0; i < n; ++i)
sum1 += std::abs(f[i] - q[i]);
sum1 /= n;
double sum2{};
for (std::size_t i = 0; i < n; ++i)
sum2 += std::abs(f[i] - q[i]) - q[i];
sum2 = sum2 / n + average_of_q;
std::cout << std::abs(sum1 - sum2) << std::endl;
return 0;
}
输出是
1.11022e-16
,而我们理论上期望它应该是0
。我怎样才能优化这段代码,使std::abs(sum1 - sum2)
尽可能小?
为了激发这一点:在我的实际应用中,我已经知道
average_of_q
并且我不需要遍历每个i
,因为我知道std::abs(f[i] - q[i])
对于大多数i
来说非常小,这是为什么我需要使用 sum2
. 的公式
编辑:我也在 MSE 上询问了这个问题的理论部分(但略有不同;我不想在这里让事情变得太复杂):https://math.stackexchange.com/ q/4688917/47771.