求教一个计算圆周率的最优算法

dengcainiao 2002-05-10 07:05:28
写谢谢
...全文
127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tice 2002-05-20
  • 打赏
  • 举报
回复
那要算多久?
qtf 2002-05-12
  • 打赏
  • 举报
回复
这么厉害!!!
10亿?
xuying 2002-05-11
  • 打赏
  • 举报
回复
上面的程序可以算任意位。
xuying 2002-05-11
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>

#define Fcalloc calloc
#define Ffree free
#define Size_T unsigned long

long kf, ks;
long *mf, *ms;
long cnt, n, temp, nd;
long i;
long col, col1;
long loc, stor[21];

void shift(long *l1, long *l2, long lp, long lmod) {
long k;

k = ((*l2) > 0 ? (*l2) / lmod: -(-(*l2) / lmod) - 1);
*l2 -= k * lmod;
*l1 += k * lp;
}

void yprint(long m) {
if (cnt<n) {
if (++col == 11) {
col = 1;
if (++col1 == 6) {
col1 = 0;
printf("\n");
printf("%4ld",m%10);
}
else printf("%3ld",m%10);
}
else printf("%ld",m);
cnt++;
}
}

void xprint(long m) {
long ii, wk, wk1;

if (m < 8) {
for (ii = 1; ii <= loc; )
yprint(stor[(int)(ii++)]);
loc = 0;
}
else {
if (m > 9) {
wk = m / 10;
m %= 10;
for (wk1 = loc; wk1 >= 1; wk1--) {
wk += stor[(int)wk1];
stor[(int)wk1] = wk % 10;
wk /= 10;
}
}
}
stor[(int)(++loc)] = m;
}


void memerr(int errno) {
printf("\a\nOut of memory error #%d\n", errno);
if (2 == errno)
Ffree(mf);
_exit(2);
}

int main(int argc, char *argv[]) {
int i=0;
char *endp;

printf("\n");
printf("PI Caculater made by Godman\n");
printf("$Id: pi.c 1.14 1998/12/03 15:04:23 GUOXM Exp $\n");
printf("==============================================\n");

stor[i++] = 0;
if (argc < 2) {
puts("\aUsage: PI <number_of_digits>");
return(1);
}
n = strtol(argv[1], &endp, 10);
if (NULL == (mf = Fcalloc((Size_T)(n + 3L), (Size_T)sizeof(long))))
memerr(1);
if (NULL == (ms = Fcalloc((Size_T)(n + 3L), (Size_T)sizeof(long))))
memerr(2);
printf("\nApproximation of PI to %ld digits\n", (long)n);

cnt = 0;
kf = 25;
ks = 57121L;
mf[1] = 1L;

for (i = 2; i <= (int)n; i += 2) {
mf[i] = -16L;
mf[i+1] = 16L;
}

for (i = 1; i <= (int)n; i += 2) {
ms[i] = -4L;
ms[i+1] = 4L;
}

printf("\n 3.");
while (cnt < n) {
for (i = 0; ++i <= (int)n - (int)cnt; ) {
mf[i] *= 10L;
ms[i] *= 10L;
}
for (i =(int)(n - cnt + 1); --i >= 2; ) {
temp = 2 * i - 1;
shift(&mf[i - 1], &mf[i], temp - 2, temp * kf);
shift(&ms[i - 1], &ms[i], temp - 2, temp * ks);
}
nd = 0;
shift((long *)&nd, &mf[1], 1L, 5L);
shift((long *)&nd, &ms[1], 1L, 239L);
xprint(nd);
}
printf("\n\n======================\n");
printf("Calculations Completed!\n");
printf("You can fine this program and source code in ftp://166.111.18.56\n");
Ffree(ms);
Ffree(mf);
return(0);
}
kingfighter_han 2002-05-11
  • 打赏
  • 举报
回复
o
NowCan 2002-05-11
  • 打赏
  • 举报
回复
10亿位的都见过。
Tice 2002-05-10
  • 打赏
  • 举报
回复
我又看过了,最多可以算到3335万位
Tice 2002-05-10
  • 打赏
  • 举报
回复
我知道有个叫super pi的程序,可以算到100多万位
one_add_one 2002-05-10
  • 打赏
  • 举报
回复
最优的我不知道,比较好的,我到时知道几个。
atlantis13579 2002-05-10
  • 打赏
  • 举报
回复
肯定不是最优算法,但可以算.

long a=10000,b,c=2800,d,e,f[2801],g;
main(){for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);}
内容概要:本文围绕“面向高精度电流控制的PMSM多参数PSO辨识模型研究”,系统阐述了基于Simulink的永磁同步电机(PMSM)多参数辨识方法,重点采用粒子群优化算法(PSO)实现对电机关键内部参数的高精度辨识。研究构建了完整的PMSM控制系统仿真模型,结合智能优化算法,解决了传统参数辨识中精度低、收敛慢的问题,有效提升了电流环控制的动态性能与稳态精度。该方法特别适用于对控制精度和响应速度要求较高的工业应用场景,如高性能伺服系统、电动汽车驱动系统等,具有较强的工程实用价值和科研参考意义。文中提供了完整的Simulink仿真模型与配套代码,确保了研究内容的可复现性和实践操作性。; 适合人群:具备电机控制、自动化或电气工程等相关专业背景,熟悉MATLAB/Simulink仿真环境,从事电机驱动系统研发、控制算法设计或相关领域科研工作的工程师及研究生,尤其适合工作1-5年、希望深入理解先进参数辨识技术的研发人员。; 使用场景及目标:①开展高精度PMSM控制系统的设计与参数辨识研究;②学习并掌握PSO等智能优化算法在电机系统参数辨识中的具体实现与调优技巧;③完成学术论文复现、科研项目验证、毕业设计或工程原型开发,提升对现代电机控制核心技术的理解与应用能力。; 阅读建议:建议读者结合提供的Simulink模型与源代码进行动手实践,按照文档逻辑逐步搭建与调试仿真系统,重点关注PSO算法与电机模型的交互机制、目标函数设计及参数收敛过程,通过对比不同工况下的辨识结果,深入理解算法性能与控制精度之间的内在联系。

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧