【问题标题】:Pi squared to n digits C++Pi 平方到 n 位数 C++
【发布时间】:2014-03-15 22:08:23
【问题描述】:

我发现了许多类似的主题,但没有一个给我明确的解释。

我必须编写程序,使用这个泰勒级数计算 Pi 平方到 n 位:

π^2 = 12 (1/1^2 - 1/2^2 + 1/3^2 - 1/4^2 + ...)

这是我写的:

#include <iostream>
#include <math.h>

using namespace std;

int main() {
    int n;
    cout << "How many digits?" << endl;
    cin >> n;
    long double Pi2 = 0;
    int i = 1;

    while( precision is less than n ) {
        if ((i%2) == 1) { 
            Pi2 += 1/pow(i,2); 
            i+=1;
    }
        else {
            Pi2 -= 1/pow(i,2); 
            i+=1; 
            }
    }

Pi2 *= 12;

cout << Pi2 << endl;
return 0;
}

我不知道在 while() 中写什么?这个循环应该什么时候停止?

【问题讨论】:

  • 当您希望它停止时(即当您将 pi 计算到 n 位时)
  • 这是一道数学题,不是编程题。 “错误”是您未计算的剩余无限元素。您可以绑定到该金额,然后您知道何时停止
  • 这里是一些没有为你解决家庭作业的阅读材料:zweigmedia.com/pdfs/TaylorSeries.pdf.. 顺便说一句,这类问题属于 math.stackexchange.com/
  • 查看此代码 stackoverflow.com/questions/22050980/… 并将 while 写入 epsilon。

标签: c++ pi


【解决方案1】:

如果您知道所需的精度,您可以在开始循环之前计算 n 的最大值的正确值。 第二件事:如果您开始添加所有增量值,请从最少的数字开始。

类似

int ndigits;
cout << "How many digits?" << endl;
cin >> ndigits;
int n = int( pow( double(10), double(ndigits)/2 ) + 0.5 );
long double Pi2 = 0;
int i = 1;

for( int i=n; i>0; --i ) 
{
    if ((i%2) == 1) { 
        Pi2 += 1/pow(long double(i),2); 
    }
    else {
        Pi2 -= 1/pow(long double(i),2); 
    }
}
Pi2 *= 12;

【讨论】:

  • 谢谢,它有效,但你能解释一下为什么会有 10^ndig/2+0,5 吗?我知道这是数学问题......但如果你能以某种简单的方式解释它,我会很高兴:)
  • 好的,我想我已经知道了,但我还有一个问题;)你能解释一下为什么这个程序必须从头开始——我的意思是--i?这对我来说是一件令人惊讶的事情。如果可以从头开始,我的意思是从 i=1 开始的迭代,这个程序会是什么样子?我试图将其更改为 (int i=1; i
  • 如果你从 i=0 开始,你的第一个值是 0.5。总和 Pi2 增加到 0.8 或更多。如果 i 的值很大,将要添加的偏移量会变得非常小 - 例如0.00000001.. double 或 long double 的精度是有限的,所以如果添加两个比例非常不同的数字,较低的一个会失去精度。做一次它不是问题 - 对它来说很多 10000 次总之你会失去准确性。更改数字的顺序意味着两个数字具有相似的比例并且不会失去准确性。
【解决方案2】:

要考虑的一种方法是使用 ndigits 创建一个“epsilon”值。
让我们假设 ndigits 是 3。这给出了 0.0001 的 epsilon

如果上一次迭代的值与当前迭代的值之间的差小于 0.0001,那么你可以假设你有你想要的值,并终止 while 循环。

虽然是一个警告。 Doubles 和 long doubles 对它们可以准确保持的位数有上限。

【讨论】:

  • 如何检查上一次迭代的值与当前值之间的差异是否小于某个值?抱歉,我知道这很容易,但我正在尝试,但我遇到了错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
相关资源
最近更新 更多