在很多特定场合,一些硬件可能不允许使用一些高等计算函数,如开根号,幂计算等。这时候就要自己写这些函数。一般都是用一些逼近方法来求取一个逼近值代替。下面就是两种自己写的求开根号的方法。
方法1 :
short HWR_sqrt_16(unsigned short M)
{
short N, i;
short tmp, ttp;
if (M == 0) return 0;
else if (M < 4) return 1;
else if (M < 9) return 2;
else if (M < 16) return 3;
else if (M < 25) return 4;
else if (M < 36) return 5;
else {
N = 0;
tmp = (M >> 14);
M <<= 2;
if (tmp > 1){
N ++;
/* tmp -= N; */
tmp = tmp - N;
}
for (i=7; i>0; i--){
N <<= 1;
tmp <<= 2;
tmp += (M >> 14);
ttp = N;
ttp = (ttp<<1)+1;
M <<= 2;
if (tmp >= ttp){
/* tmp -= ttp;*/
tmp =tmp - ttp;
N ++;
}
}
return N;
}
}
方法二:
#include<stdio.h>
#include<stdlib.h>
float sqrt_fun(float inNum)
{
float x, gap,term=0.0000001;
for(x=1;x*x<=inNum;x++);
gap=x*x-inNum;
while(gap>=term)
{
x=(gap+2*inNum)/(2*x);//牛頓法
gap=x*x-inNum;
}
return x;
}
void main(){
float a,b;
printf("請輸入:");
scanf("%f",&a);
b = sqrt_fun( a );
printf("%f\n",b);
}
希望大家能够将自己写的其他的一些数学函数程序能共享出来,以方便大家使用。
评论