我正在自学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
任何提高精确度的建议还是这件事都不重要?或者,如果您认为我应该在这里学习另一课,请随时提供。谢谢!
答案 0 :(得分:9)
您需要使用浮点以外的其他方法执行计算。有用于进行“长数学”的库,例如GMP。
如果那不是你想要的,你也可以编写代码来自己完成。最简单的方法是只使用一个字符串,并为每个字符存储一个数字。如果您在纸上手工完成,那么就算数学一样。将数字加在一起相对容易,减法也是如此。进行乘法和除法有点困难。
对于非整数,您需要确保将加法/减法的小数点对齐...
写这篇文章是一个很好的学习经历,但是不要指望它是半小时内没有太多想法的东西[加减法,也许!]
答案 1 :(得分:1)
您可以在GCC / clang中使用quad math,内置类型__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;
}