【问题标题】:Computing Pi with C++用 C++ 计算 Pi
【发布时间】:2015-06-25 16:11:31
【问题描述】:

我正在尝试使用以下公式计算 Pi: http://functions.wolfram.com/Constants/Pi/06/01/01/0005/

这是代码:

#include <iostream>
#include <cmath>
using namespace std;

int main() {

    long double n;
    cin >> n;
    long double first_part = 0.0, second_part = 0.0, pi = 0.0;

    for(int i = 0; i <= n; i++)
    {
        first_part += (pow(-1, n)) / ((2 * n + 1) * pow(5, 2 * n + 1));

        second_part += (pow(-1, n)) / ((2 * n + 1) * pow(239, 2 * n + 1));
    }

    pi = (first_part * 16) - (second_part * 4);

    cout << pi << endl;

    return 0;
}

但是出了点问题。例如,对于 n = 300,它输出 6.65027e-420。 我真的找不到我的错误。 请帮我。 非常感谢。

【问题讨论】:

    标签: c++ formula pi


    【解决方案1】:

    您使用了错误的变量:

    for(int i = 0; i <= n; i++)
        ^^^^^
         iterating over 'i'
    

    但是:

        first_part += (pow(-1, n)) / ((2 * n + 1) * pow(5, 2 * n + 1));
        second_part += (pow(-1, n)) / ((2 * n + 1) * pow(239, 2 * n + 1));
                       ^^^^^^^^^^       ^^^^^               ^^^^^^^^^^^
                          all operations use 'n'
    

    【讨论】:

      【解决方案2】:

      你达到了浮点精度的极限:

      #include <cmath>
      #include <iostream>
      
      int main()
      {
          // This will print inf (infinite)
          std::cout <<  std::pow(5.0, 600.0) << "\n"; // pow(5, 2 * n + 1))
          return 0;
      }
      

      【讨论】:

        【解决方案3】:

        更改您的代码,将for loop 中的所有n 替换为i:

        #include <iostream>
        #include <cmath>
        using namespace std;
        
        int main() {
        
            long double n;
            cin >> n;
            long double first_part = 0.0, second_part = 0.0, pi = 0.0;
        
            for(int i = 0; i <= n; i++)
            {
                first_part += (pow(-1, i)) / ((2 * i + 1) * pow(5, 2 * i + 1)); 
        
                second_part += (pow(-1, i)) / ((2 * i + 1) * pow(239, 2 * i + 1));
            }
        
            pi = (first_part * 16) - (second_part * 4);
        
            cout << pi << endl;
        
            return 0;
        }
        

        我跑了上面的代码,发现了:

        3.14159

        小心:pow(239, 2 * n + 1))会溢出second_part!因为double 具有范围:

        1.7E +/- 308 (15 digits)
        

        参考here。

        【讨论】:

          猜你喜欢
          • 2010-09-07
          • 1970-01-01
          • 2017-09-27
          • 1970-01-01
          • 2019-05-12
          • 2015-12-16
          • 1970-01-01
          • 2015-08-23
          • 1970-01-01
          相关资源
          最近更新 更多