博客 | 算法 | C++高精度算法,求π值(>100万位)
高精度算法求π值
·
以下是求π的高精度算法程序,可以在普通PC上跑出100多万位,毫无压力,有兴趣的朋友可以试试。
#include"cstdio";
using namespace std;
void pi(long length) {
unsigned long n = 0; //循环次数
int flag = 1; //循环结束标志
long numerator = 2; //分子
long denominator = 5; //分母
char pi[length] = {0}; //字节类型数组
char temp[length] = {0}; //
int result = 0; //未进位前的数字
int carry = 0; //进位数
long sum = 0; //求和汇总
//赋初始值
pi[0] = 2;
temp[0] = 0;
for (long i = 1; i < length; i++) {
pi[i] = 6;
temp[i] = 6;
}
//开始运算
while (flag && (n < 320000)) {
// Serial.print("第");
printf("%d\n",n);
// Serial.println("轮");
//从低位到高位依次乘法和进位运算
carry = 0;
for (long i = length - 1; i >= 0; i--) {
result = temp[i] * numerator + carry;
temp[i] = result % 10;
carry = result / 10;
}
//从高位到低位依次进行除法运算
carry = 0;
for (long i = 0; i < length; i++) {
result = temp[i] + carry * 10;
temp[i] = result / denominator;
carry = result % denominator;
}
//从低位到高位依次把temp[]的数据累加到pi[]中
for (long i = length - 1; i >= 0; i--) {
result = temp[i] + pi[i];
pi[i] = result % 10;
pi[i - 1] += (result / 10);
}
//判断temp[]的后20个数是否为0,如果为都为0则退出循环,这样设计可以提高运算速度
flag = 0;
sum = 0;
for (long i = length-1; i >= length-20; i--) {
sum += temp[i];
}
if (sum == 0) {
flag = 0;
} else {
flag = 1;
}
//更新循环数字
n++;
numerator++;
denominator += 2;
}
//输出计算结果
for (long i = 0; i < length; i++) {
printf("%d",(int)pi[i]);
if (i == 0)printf(".");
}
}
int main() {
pi(10000); //调用函数,参数为pi的位数
}
更多推荐
所有评论(0)