单片机能不能用来求圆周率pi
最近接个任务,说用单片机(C8051f340)求π,而且还要一位一位地输出,但是单片机本身ram就很小,用不了大数组,而且浮点运算能力也很差,怎么能用来求π呢?求大神指正!!!!
因为PI的值你可以用计算机算啊,你把结果存在ROM中,然后输出,128K的ROM你可以存120K位多,超过10万位,应该够了
任务的描述是求π的程序烧到单片机上,然后结果用串口输出,中间变量用eeprom存取,也就是说单片机做运算,而不是计算机来做。不过,还是十分感谢三楼的回答。
我想知道的是,求π(不限精度)有没有那种能在单片机上就完成的算法,不限精度,但是中间变量的存储空间受限,而且浮点运算不推荐,其中已经求出的π的前几位的值无需保存,用串口输出去就可以了
char *pi = "3.1415926.....".
pi[0],pi[1]...
目前PI有2种算法,一种是正多边形逼近,另一种是随机数.我没做过所以不知道具体怎么做,楼主网上搜索一下,正多边形逼近这个好理解算法应该简单点
第三个比较怪异的方法是我在网上看到的,据说某一年The International Obfuscated C Code Contest(国际模糊C代码大赛)上的获奖作品
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*a, f=d%--g, d/=g--, --b; d*=b); scanf("%s"); } }
关于pi的算法,我没有研究过,不过对于你说的2000*10000溢出问题,我倒是有个见解:那是我们以前在4位的单片机上实现10位10进制加减乘除,也就是计算器功能的做法,不把数据当数据,而是把数据当数组,然后用我们小学学过的竖式算法计算,就是在草稿纸上算乘法的那种算法,为了简单起见,我都是用倒序的方法存的数据。
char num1[5]={0,0,0,2,0}; //2000 j char num2[5]={0,0,0,0,1}; //10000 i char result[10]; //结果10位,以上都是倒序 char temp[10]; int i,j; memset(result,0,10); for(i = 0; i < 5; i++) { memset(temp,0,10); for(j = 0; j <5; j++) { temp[i+j] += num2[i] * num1[j]; temp[i+j+1] = temp[i+j]/10; //进位处理 temp[i+j] %=10; } for(j = 0; j < 10; j++) { result[j] += temp[j]; result[j+1] += result[j]/10; //进位处理 result[j] %= 10; } }
本来没什么思路的,看到55楼,眼前一亮。 想起了以前周立功机考时遇到的一道题。 一个Byte就有8bit,这8bit就能表示出:2的7次方+(2的7次方-1)大小的数据。
2的25次方就是 16384*2048,就已经比你的2000*10000大了, 但这只需要4个byte既可以存储了.
ps: 丫的 数字的次方怎么打字出来啊~~~