penny2799 发表于 2008-3-23 10:11:37

一般的单片机开方都有什么方法哪

如题
楼下的看错了,我说开方运算

ghost2 发表于 2008-3-23 10:17:55

1、花钱请人开发;
2、买现成方案;
3、从ourdev找开源资料照抄;
4、自己动手。

zhonghua_li 发表于 2008-3-23 14:50:51

牛顿迭代
   牛顿法是方程求根的一个有力方法,常常能快速求出其他方法求不出或者难以求出的解。
假定有一个函数y=f(x),方程f(x)=0在 x = r 处有一个根,对于此根,我们先估计
个初始值 Xo(可以是猜测的)。我们现在来得到一个更好的估计值X1。为此趚=Xo处作该曲线的切线,并将其延长与 x 轴相交。切线与x轴的交点通常很接近 r ,我们用它作为下一个估计值X1,求出X1后,用X1代替Xo。重复上述过程,在x=X1处作曲线的另一条切线,并将其延长至与x轴相交,用切线的x轴截距作为下一个近似值X2……这样继续下去,所得出的这个x轴截距的序列通常迅速接近根r

    现在再让我们从代数角度看上述过程,我们知道,在初始值Xo处,切线的斜率是f'(x),切线方程为
   
                      y - f(xo) = f'(xo)(x - xo)

    在此切线与x轴相交处,有y=0 ,x=x1,因而有

                     0 - f(xo) = f'(xo)(x1 - xo)

    只要f'(xo)不为0,可解出x1,得
                                    f(xo)   
                     x1 = x0 - ---------
                                     f'(xo)

   重复该过程,可得下一近似值为
                                     f(x1)   
                     x2 = x1 ---------
                                    f'(x1)
   
   总结n = 0,1,2,……的情形得出下述结果

         _______________________________________________   
         |牛顿法:                                 
         |                                             
         |            只要f'(xn) ≠ 0,则有         
         |                                    f(Xn)         
         |            X(n+1) = Xn -   --------      
         |                                    f'(Xn)         
         |_____________________________________________|

      注意:牛顿法也有不成功的时候,若f(x)无根,则,序列不收敛。另外,一些函

数图像可能形成随即序列,这就需要其他的辅助条件。   

      附注:f'(x)表示函数f(x)的导函数,f'(xo)则表示函数f(x)在x = xo处的导数

zhonghua_li 发表于 2008-3-23 14:52:21

http://www.fjtu.com.cn/fjnu/courseware/0329/course/_source/web/lesson/char2/j4.htm
这里更详细

ghost2 发表于 2008-3-23 15:15:03

呃,明明看到“单片机开发”啊

hittiger 发表于 2008-3-23 16:39:27

查表,用电脑做一个table查表便是。最好是整数。

penny2799 发表于 2008-3-23 21:08:26

谢谢大家

hht594 发表于 2013-8-12 20:35:47

我也在寻找呀!

信天游 发表于 2013-8-13 08:05:48

搜索卡马克

millwood0 发表于 2013-8-13 08:14:28

搜索卡马克

:)

google "doom fast inverse square root"

and let me post it here:
float Q_rsqrt( float number )
{
      long i;
      float x2, y;
      const float threehalfs = 1.5F;

      x2 = number * 0.5F;
      y= number;
      i= * ( long * ) &y;                     // evil floating point bit level hacking
      i= 0x5f3759df - ( i >> 1 );               // what the fuck?
      y= * ( float * ) &i;
      y= y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//      y= y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

      return y;
}This is probably the most fascinating piece of code anyone has written over the last 50 years. Bar none.

and we still don't know who exactly wrote it, and how s/he came up with the magic number.

enjoy.

lkm_unication 发表于 2013-8-13 08:56:12

这个必须mark,记得以前也看过,是一个大神创造的那个magic number。

canspider 发表于 2013-8-13 08:58:30

数学课逃课的人伤不起啊

marx 发表于 2013-9-5 10:57:57

整形还是浮点数?

xjj123456789 发表于 2014-1-24 09:09:10

论坛里面有整形开方算法,挺好

marshallemon 发表于 2014-1-24 09:15:45

使用标准库函数

unifax001 发表于 2014-1-24 09:26:20

这个需要记下 以后用的到的,归根结底不是单片机开方,而是人开方

游在云间 发表于 2014-7-5 08:51:15

xjj123456789 发表于 2014-1-24 09:09
论坛里面有整形开方算法,挺好

能给个链接吗?现在找不到了

梦想号 发表于 2014-7-7 22:12:46

好像math.h头文件里面有现成的函数吧
页: [1]
查看完整版本: 一般的单片机开方都有什么方法哪