- 注册时间
- 2010-2-12
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 1220
- 在线时间
- 小时
|
发表于 2026-5-1 20:25:08
|
显示全部楼层
本帖最后由 只是呼吸 于 2026-5-1 20:40 编辑
下面贴出计算pi的agl代码。这里面是有很大的坑,我把它指出来,再填了它,如果要用agl算pi的,那就借鉴去,以免掉坑里。
- void re_give(Number& src, int b)
- {
- src.pbig[0] = b;
- src.used = 1;
- src.decimal = 0;
- }
- static void re_give(Number& src, int a, int b)
- {
- src.pbig[0] = 250000000;
- src.used = 1;
- src.decimal = 1;
- }
- int pi_agl(Number& pi, int pilen)
- {
- int len;
- len = 2 * (pilen / 9 + 1);
- Number a(len), b(len), t(len), a1(len), b1(len), t1(len);//pi(100000);
- int w = 0, p = 1;
- ////a = 1.0;a,b,t,p赋初值
- ////b = 1 / sqrt(2);
- ////t = 1.0 / 4;
- ////p = 1;
- //
- re_give(a, 1);
- re_give(b1, 2);
- mp_sqrt(b, b1, pilen);///////
- div_one(b, b, 2);////////////////
- re_give(t, 1, 4);// t= 1/4
- std::cout << "初始化计算完成" << std::endl;
- while (w < 19)
- {
- //a1 = (a + b) / 2;
- //b1 = sqrt(a * b);
- //t1 = t - p * ((a - (a + b) / 2) * (a - (a + b) / 2));
- //p1 = 2 * p;
- //pi = ((a1 + b1) * (a1 + b1)) / (4 * t1);
- re_add(a1, a, b);//////---------------------------
- div_one(a1, a1, 2);//// a1
- mp_mul(t1, a, b);/////-------------------------------乘法
- re_shr(t1, a.used);///-----------------;右移
- mp_sqrt(b1, t1, pilen);// b1
- re_sub_abs(a, a, a1);///===
- mp_sqr(b, a);/////====-------------------------------/// 平方
- re_shr(b, a.used);///-------------------------------/////右移
- re_one_mul(b, b, p);
- re_sub_abs(t1, t, b); //// t1
- p <<= 1;
- re_mov(a, a1);
- re_mov(b, b1);
- re_mov(t, t1);
- w++;
- std::cout << "第" << w << "次计算完成" << std::endl;
- }////////
- std::cout << "最后计算π" << std::endl;
- //pi = ((a1 + b1) * (a1 + b1)) / (4 * t1);
- add_help(a1, b1, 0);
- div_one(b1, a1, 2);
- mp_sqr(a1, b1);/////-------------------------------
- //re_shr(a1, b1.used);///-------------------------------
- re_shr(t, t.used / 4);
- re_Newton(pi, a1, t, pilen / 9 + 1);////////
- std::cout << "π计算完成" << std::endl;
- return 0;
- }
复制代码 |
|