13

我正在自学 C++,在这个练习题上,它要求编写可以将 PI 计算到 30 位以上的代码。我了解到 double / long double 在我的计算机上都是 16 位精确的。

我认为这个问题的教训是能够计算超出可用精度的精度。因此,我该怎么做?是否可以?

我现在计算 Pi 的代码是

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;

int main(){ 

    double pi;
    pi = 4*atan(1.0);
    cout<<setprecision(30)<<pi;
    return 0;
}

输出为 16 位,下面列出了 pi 到 30 位以供比较。

3.1415926535897931
3.141592653589793238462643383279

有什么提高精度的建议吗?或者这永远都不重要了?或者,如果您认为我应该在这里学习其他课程,请随时提供。谢谢!

4

2 回答 2

10

您将需要使用浮点以外的其他方法执行计算。有一些用于做“长数学”的库,例如GMP

如果这不是您要查找的内容,您也可以自己编写代码来执行此操作。最简单的方法是只使用一个字符串,并为每个字符存储一个数字。像在纸上手工做数学一样做数学。将数字加在一起相对容易,减法也是如此。做乘法和除法有点困难。

对于非整数,您需要确保将小数点对齐以进行加/减...

这是一个很好的学习经历,但不要指望它会是你在半小时内不加思索地敲出的东西[也许是加减法!]

于 2013-02-01T00:26:58.533 回答
3

您可以在 GCC/clang 中使用四元数学、内置类型__float128q/Q后缀。

#include <stdio.h>

#include <quadmath.h>

int main ()
{
  __float128 x = strtoflt128("1234567891234567891234567891234566", nullptr);
  auto y = 1.0q;
  printf("%.Qf", x + y); // there is quadmath_snprintf, but this also works fine
  return 0;
}
于 2018-02-01T13:15:31.087 回答