我正在编写一个程序来查找pi的值,并希望它显示超过标准的16位小数。 如何创建一个可以容纳16位小数以上的变量? 我目前的计划如下。 使用Dev-C ++:
#include<iostream.h>
#include<conio.h>
#include<math.h>
int factorial(int a)
{
int b=1,c=1;
for(c; c<=a; c++)
{
b=b*c;
}
return b;
}
int main()
{
cout.precision(300);
long int n,a;
long double z=0,pi,num,den;
for(n=0; n<1000000; n++)
{ //begin for
num=(pow(factorial(2*n),3))*((42*n)+5);
den=(pow(factorial(n),6))*(pow(16,(3*n)+1));
z=z+(num/den);
pi=1/z;
if(n%1==0)
{
cout<<z<<endl; //test print statement
cin>>a;
cout<<pi;
cout<<endl;
}
}
getch();
return 0; //end for
}
答案 0 :(得分:2)
如果您不想使用现有的高精度算术库,那么这里有一些用于编写自己的算法库的指针。这将是一项相当多的工作(并且调试非常繁琐),但如果你有时间的话,这是一次很好的学习练习。
将每个数字存储为较小“数字”的数组。对于一个非常简单(但效率低下)的实现,这些实际上可以是十进制数字,值为0到9 - 这将非常容易打印。为了更有效的实现,我可能会使用32位值作为“数字”。您还需要决定如何表示负数,数组是固定的还是可变的大小,以及(对于非整数),小数点是固定还是浮动。
使用您在小学学到的算法实现基本算术:使用进位,借位减法,长乘和长除法。
pow
和factorial
可以简单地实现为重复乘法;如果速度不够快(以及sqrt
和sin
等无法用基本操作完全表示的函数),则可以使用其他算法。
答案 1 :(得分:0)
听起来你想要一个bignum图书馆。查看the GNU Multiple Precision Arithmetic Library广泛使用的开源替代方案。
答案 2 :(得分:0)
您可以使用互联网上的一个bigint库,例如:https://mattmccutchen.net/bigint/