打印

单片机计算圆周,PI应该取多少?

[复制链接]
3923|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pilieren|  楼主 | 2007-11-26 11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在一个程序设计中需要根据直径(半径)大小,算出总里程及运动速度,这里半径可以设定精确到mm,此时计算圆周---〉里程及速度,想不清楚 PI (圆周率)应该取多少??!
    取 3 的话误差是不是过大?取3.14 浮点运算是不是过于麻烦(小题大做)以及51实现是不是太繁琐?!!
    还是一般取3就可以了???
    请各位大虾指教!!
    谢谢!!

相关帖子

沙发
HWM| | 2007-11-26 11:07 | 只看该作者

如果你想“毛估估”,就没问题,呵呵。

使用特权

评论回复
板凳
wlm802003| | 2007-11-26 12:01 | 只看该作者

先将PI放大N倍,算出结果后再除N倍

使用特权

评论回复
地板
HWM| | 2007-11-26 12:05 | 只看该作者

楼上:你不怕乘“爆”了吗?

还是用浮点运算吧。

使用特权

评论回复
5
xwj| | 2007-11-26 12:44 | 只看该作者

当然不能太"毛"了

扩展乘除法的位数,就不怕乘“爆”了
就算这样慢一点,但还是要比浮点运算快得多

使用特权

评论回复
6
ldyeah| | 2007-11-26 12:47 | 只看该作者

取3的误差大了电吧

用浮点数吧

使用特权

评论回复
7
ayb_ice| | 2007-11-26 14:18 | 只看该作者

用先X一个整数,再除以一个整数。。。

X/X约=PI。。。

使用特权

评论回复
8
forthlab| | 2007-11-26 15:15 | 只看该作者

用3.14*128,然后结果再截位

使用特权

评论回复
9
xwj| | 2007-11-26 15:26 | 只看该作者

唉,笨死了

谁让你每次都去算的啊?
你就不能设置时算一次,以后就用算好的结果来加吗???

就算非要每次都计算,单片机的速度比人算也快多了,根本就感觉不到延迟的

使用特权

评论回复
10
5880527| | 2007-11-26 21:37 | 只看该作者

201/64

使用特权

评论回复
11
ywqywqywq| | 2007-11-26 22:00 | 只看该作者

取祖冲之的密率

355/113
这个分数的精度很高,就是不知道你作除法是否方便。

使用特权

评论回复
12
yanfengzhu| | 2007-11-26 22:25 | 只看该作者

楼上的实现可取。

使用特权

评论回复
13
一无所知| | 2007-11-27 16:25 | 只看该作者

PI的精度由你的需求所决定~

    你现在是通过半径来求,里程和速度。如果半径已经固定了。那么只要知道里程的精度和速度的精度,那么就可以根据这个来到推出你的PI的取值范围在多少才能保证你的精度了。
    然后剩下的事情,是在保证你的精度的前提下,来优化你的算法。
    
    所以~~你的里程和速度的精度是多少啊?
    5%? 1% ? 还是0.5%?
    
    换句土一点的话说,你算出来的里程数和实际的里程数,所允许或是容忍的相差范围是多少啊?
   
    假设你在计算中用一个系数K来代替PI(这个K值由您来定,可以是3,可以是3.14,更可以是355/113)。
    那么通过小学的计算我们可以得到下面两个式子
    一个是实际里程S=2PIR
    一个是计算里程S1=2KR

    那么,你只要通过调整K值,使|S1-S|/S的值是落在在您的精度内就可以了
    貌似我觉得3就够了。   

使用特权

评论回复
14
happystar| | 2007-11-27 19:14 | 只看该作者

re

记得匠人那边有个“外星人”算法,嘿嘿,一点也看不懂

使用特权

评论回复
15
IceAge| | 2007-11-27 23:36 | 只看该作者

3.1415927 * 16384

 = 51472  ( 3.1416 )  

Diameter * PI  --> (Diameter  * 51472) >> 14 

使用特权

评论回复
16
milk_wong| | 2007-11-27 23:45 | 只看该作者

51都这么做吧...

3.141592654 = 2 + 1 + 1/8 + 1/64 + ....

x = (x << 1) + x + (x >> 3) + (x >> 6) + ...

使用特权

评论回复
17
hotpower| | 2007-11-28 00:45 | 只看该作者

学习学习~~~

IceAge早安~~~

使用特权

评论回复
18
computer00| | 2007-11-28 00:53 | 只看该作者

3.1416*10000 =31416

例如半径为1米,那么周长为:

2*1*31416=62832,你自己心里知道结果是6.2832米就行了,实际上这个就是一个定点小数。


如果结果只保留整数部分的话,放大倍数改成2的n次方比较快,最后的结果直接用移位即可得。

使用特权

评论回复
19
xwj| | 2007-11-28 03:09 | 只看该作者

16楼的计算方法很好!

 milk_wong 发表于 2007-11-27 23:45 侃单片机 ←返回版面    

16楼: 51都这么做吧... 

3.141592654 = 2 + 1 + 1/8 + 1/64 + ....

x = (x << 1) + x + (x >> 3) + (x >> 6) + ... 
 


实际上对于人机交互,随便什么方法都可以,先做出来再说!
毕竟对于计算人比电脑慢太多了

使用特权

评论回复
20
5880527| | 2007-11-28 09:41 | 只看该作者

11楼的355/113这个精度很高很高了

我一般取201/64,这个精度也很好,先做完所有的乘法再除64

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

237

帖子

3

粉丝