C++计算比double或long double更精确

13

我正在自学C++,在这个练习问题上,它要求编写代码以计算30位以上的圆周率。我发现我的计算机上double / long double都只有16位精度。

我认为这个问题的教训是要能够计算超出可用精度的精度。那么我该怎么做呢?这是可能的吗?

我现在用于计算圆周率的代码是:

#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位,圆周率保留30位。

3.1415926535897931
3.141592653589793238462643383279

有关提高准确性的建议吗?还是说这永远不重要?如果您认为我应该在这里学到其他课程,也可以自由地提供。谢谢!


你需要准确的是一个算法:http://www.cplusplus.com/forum/beginner/1149/ - turnt
@Cygwinnian 谢谢。这也是一种巧妙的编码方式。 - Terence Chow
你可能会觉得这很有趣:http://www.math.hmc.edu/funfacts/ffiles/20010.5.shtml - Carl
2个回答

10

您需要使用除浮点数之外的其他方法进行计算。有一些“长数字”库可以使用,例如GMP

如果那不是您想要的,您也可以编写代码自行完成。最简单的方法就是使用字符串,每个字符存储一个数字。执行计算时,就像在纸上做手工运算一样。加法和减法相对容易,乘法和除法则稍微难一些。

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

编写这样的程序是很好的学习经验,但不要指望它是您半小时内能够轻松完成的事情 [或许可以完成加减法!]


啊,好的,那很有道理。我会检查 GMP,但是将数字存储在字符串中有点巧妙。感谢您的回答! - Terence Chow
1
我曾经在20世纪80年代的ABC-80计算机上使用Basic进行计算,使用了“字符串数学” - 我相当确定我们曾经计算过pie。然而,我认为它被限制在26位数字左右。 - Mats Petersson
这也是我的解释 - 没有“作弊”。 - Mats Petersson

3
您可以在GCC/clang中使用四元数数学、内置类型__float128以及q/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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接