随着样本数量的增加,Pi 变得不准确

问题描述 投票:0回答:1

当我将第 28 行的值(我用箭头指出)从 0.00001 更改为 0.000001 时,Pi 的值变得不准确。对于我来说,提高精度如何使值错误是违反直觉的?该程序只是使用 4 / (1 + x*x) 在 0 到 1 上的积分来计算 pi。

#include <iostream>

void fourOverX2(float& value, 
        const float lowerLimit, 
        const float upperLimit,
        const float dx)
{
    std::cout << "Values Sent: \n" 
    << lowerLimit << "\n" << upperLimit 
    << "\n" << dx << std::endl;

    value = 0;

    float x = lowerLimit, numerator = 4 * dx;

    while(x < upperLimit)
    {
        value += numerator / (1 + x * x);
        x += dx;
    }
}


int main()
{
    float value;

    fourOverX2(value, 0, 1, 0.000001); // <---- doubt here

    std::cout << "PI: " << value << std::endl;

    return 0;
}

我的机器上的关联输出

c++ floating-point pi
1个回答
0
投票

在左黎曼和中使用大小为 dx 的 N 个步骤,会给出大小为 dx 的方法误差和(相对)大小为 N*mu 的累积浮点误差。这些平衡以最小误差给出 dx ~ sqrt(mu)。

对于32位浮点mu=2^-23,因此dx的最小误差应约为5*10^-4。您的两个探头完全位于累积浮点区域。

使用 64 位浮点会将最佳步长变为 10^-8。我建议使用更好的集成方案。通过简单的修改,您可以获得中点法和梯形法。仍然可以使用四阶辛普森求积法。使用更高阶的方法,您可以获得更好的精度,并且在更大的步长下也能获得最佳误差。

© www.soinside.com 2019 - 2024. All rights reserved.