当我将第 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;
}
在左黎曼和中使用大小为 dx 的 N 个步骤,会给出大小为 dx 的方法误差和(相对)大小为 N*mu 的累积浮点误差。这些平衡以最小误差给出 dx ~ sqrt(mu)。
对于32位浮点mu=2^-23,因此dx的最小误差应约为5*10^-4。您的两个探头完全位于累积浮点区域。
使用 64 位浮点会将最佳步长变为 10^-8。我建议使用更好的集成方案。通过简单的修改,您可以获得中点法和梯形法。仍然可以使用四阶辛普森求积法。使用更高阶的方法,您可以获得更好的精度,并且在更大的步长下也能获得最佳误差。