求大神指正!!!单片机能不能用来求圆周率pi

舟遥 2012-12-02 05:52:49
加精
最近接个任务,说用单片机(C8051f340)求π,而且还要一位一位地输出,但是单片机本身ram就很小,用不了大数组,而且浮点运算能力也很差,怎么能用来求π呢?求大神指正!!!!
...全文
4666 111 打赏 收藏 转发到动态 举报
写回复
用AI写文章
111 条回复
切换为时间正序
请发表友善的回复…
发表回复
hw198906020074 2012-12-22
  • 打赏
  • 举报
回复
学习了!谢谢!
  • 打赏
  • 举报
回复
学习了,网上牛人无数
舟遥 2012-12-15
  • 打赏
  • 举报
回复
今天结贴! 感谢各位对本帖的关注和讨论,感谢版主woshi_ziyu对本帖的推荐。这个问题目前还没有解决,而已经讨论过的比较好的办法就是使用查表的方法,虽然这个已经不是在计算π了。其他的像sophyyoung提出的用字符数组模拟大整数运算来解决溢出的方法,是一般性的思路,当运算过程不是很复杂时可行,但是运算稍微复杂一些就显得不实际了。而求π的运算过程是很复杂的,我在#13楼给出的spigot算法,如果要用字符数组来模拟,不太实际。 如果有谁之后还知道有可以解决这个问题的方法,不妨告知我一声。这个已经不是任务需求了,而是想知道关于这个问题的一些新思路,那必然要么是算法上的突破,要么是编程艺术的体现,而这两者都是十分赏心悦目的。谢谢各位了。
萧凯 2012-12-12
  • 打赏
  • 举报
回复
讨论的好呀,非常不错
sghui001 2012-12-11
  • 打赏
  • 举报
回复
学习学习!值得借鉴
YHL27 2012-12-11
  • 打赏
  • 举报
回复
关注下。。。
Daxus Gu 2012-12-11
  • 打赏
  • 举报
回复
烧到rom或者flash里面去,然后用查表法是最科学的方法,单片机做浮点还是算了吧
wscb1234560 2012-12-11
  • 打赏
  • 举报
回复
厉害,原来是这样
舟遥 2012-12-11
  • 打赏
  • 举报
回复
感谢大家对本帖的关注,我准备一周之内结贴散分,这两天先看看有没有人能彻底地直接地解决这个问题。
舟遥 2012-12-10
  • 打赏
  • 举报
回复
引用 96 楼 qq112141874 的回复:
引用 85 楼 Netown_Ethereal 的回复:多谢of123对本帖的关注!学术造假我是不敢的,如果仅仅要求前几位准确,后面的无所谓的话,这个我已经实现了,现在只是3.141592653589793238462643383279这几位都正常,使用的就是之前我在13楼提到的Spigot算法,只是原算法中是将数据扩大10000倍来运算的,我则只将数据扩大了10倍,结果……
谢谢!之前就已经看过了,在项目开始时描述的思路是这样的:逐位计算π,算到第n位时,发生掉电,保存用于计算第n位的中间变量,上电之后恢复中间变量,继续计算。由于保存到了EEPROM,使用的IIC接口,用的是内部的晶振频率,所以如果中间变量不是太多的话,存储时间应该是来得及的,而且之前已经算过的n-1位是不用保存的,已经输出了嘛。只是不凑巧,目前我还没找到这种可以在字长很短的单片机上这样逐位计算π的算法。至于查表的方式,我觉得可行,但是不太能体现MCU运算这个功能。只是单纯的保存索引记录而已。
引用 97 楼 of123 的回复:
楼主,导师的意思比较明确。他是要你实现运算中掉电保护和恢复。 其实,为了显示这个功能位数不重要了。你可以在算出 3.141592653589793238462643383279 就结束。 你在计算中,每一轮迭代开始前,都需要将继续运算所需的所有中间结果保存到非易失性存储器中,如 Flash 或 EEPROM。 如果断电,下一次上电可以从已经完成的迭代处……
这个位数太少,不到1s就能计算完,并输出来,这个不太好用于演示吧。我感觉,用于演示的话,计算至少应该在二三十分钟内不能停止。存取EEPROM不是问题,我已经弄了个计数器的程序,跟项目要求的基本框架是一样的,只是没有计算π罢了。 你说的查表不存在掉电丢失的问题,也对。因为查表的话,数据要么存储在全局数据里,要么事先存储在外设中,在这两种情况下都不存在数据丢失的问题。不过我觉得之前他们说的使用查表的方法,可能是将索引看做掉电丢失的数据,毕竟每次启动MCU时,索引值都会被重置,所以掉电保存的应该是索引值。这种情况下,这跟使用计数器就没什么差别了。
of123 2012-12-10
  • 打赏
  • 举报
回复
楼主,导师的意思比较明确。他是要你实现运算中掉电保护和恢复。 其实,为了显示这个功能位数不重要了。你可以在算出 3.141592653589793238462643383279 就结束。 你在计算中,每一轮迭代开始前,都需要将继续运算所需的所有中间结果保存到非易失性存储器中,如 Flash 或 EEPROM。 如果断电,下一次上电可以从已经完成的迭代处重新开始,仅丢失掉电时正在进行的迭代。 查表显示显然是不满足要求的,因为那样的话,所有输出数据都是硬编码,不存在掉电丢失的问题。
qq112141874 2012-12-10
  • 打赏
  • 举报
回复
引用 85 楼 Netown_Ethereal 的回复:
多谢of123对本帖的关注!学术造假我是不敢的,如果仅仅要求前几位准确,后面的无所谓的话,这个我已经实现了,现在只是3.141592653589793238462643383279这几位都正常,使用的就是之前我在13楼提到的Spigot算法,只是原算法中是将数据扩大10000倍来运算的,我则只将数据扩大了10倍,结果只有30位是正确的,之后的就不对了。如果要造假,这当然也凑合了,但是这是不负责任的……
请看78楼啊! 多年来总结的,类似的解决方案。 其实就是掉电存储当前位。你存那么多其他数据,它也来不及啊。
LianXiangTeHuiDian 2012-12-10
  • 打赏
  • 举报
回复
不错不错的值得借鉴
chezzy 2012-12-10
  • 打赏
  • 举报
回复
学习了!顶
ipop0205 2012-12-09
  • 打赏
  • 举报
回复
关注下,也遇到过类似问题
liqingya1you 2012-12-09
  • 打赏
  • 举报
回复
学习学习
airf7 2012-12-09
  • 打赏
  • 举报
回复
顶一个,很不错哦。。
wkx528 2012-12-09
  • 打赏
  • 举报
回复
学习一下,,,,,,,,,
a635506967 2012-12-09
  • 打赏
  • 举报
回复
关注一下,也遇到类似的问题
S3003000 2012-12-09
  • 打赏
  • 举报
回复
学习学习,支持
加载更多回复(76)

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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