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

时间:2013-02-01 00:18:59

标签: c++ precision

我正在自学C ++,并在this practice question上要求编写可以将PI计算为> 30位的代码。我了解到双/长双精度在我的计算机上都是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

任何提高精确度的建议还是这件事都不重要?或者,如果您认为我应该在这里学习另一课,请随时提供。谢谢!

2 个答案:

答案 0 :(得分:9)

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

如果那不是你想要的,你也可以编写代码来自己完成。最简单的方法是只使用一个字符串,并为每个字符存储一个数字。如果您在纸上手工完成,那么就算数学一样。将数字加在一起相对容易,减法也是如此。进行乘法和除法有点困难。

对于非整数,您需要确保将加法/减法的小数点对齐...

写这篇文章是一个很好的学习经历,但是不要指望它是半小时内没有太多想法的东西[加减法,也许!]

答案 1 :(得分:1)

您可以在GCC / clang中使用quad math,内置类型__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;
}