|
楼主 |
发表于 2014-7-13 17:13:14
|
显示全部楼层
本帖最后由 liuqian 于 2014-7-13 17:14 编辑
这还用打赌,你真JB闲
给你看看我的程序,针对应用做了优化
// Light Level (lux) = (Ch0 - Ch1) * 0.39 * e^(-0.181R^2)
// where R = Ch1/(Ch0-Ch1)
// if Ch0=3887, Ch1=0, lux=1515.93
// In EXTENDED MODE, acture lux is 5X, so max=1515.93*5=7579
U16 Ch0,Ch1,lux;
double k;
if(a0==0)
return 0;
Ch0=AdcDecode(a0);
Ch1=AdcDecode(a1);
Ch0-=Ch1;
k=-0.181*Ch1*Ch1/Ch0/Ch0;
if(k<-9)
return 0;
#ifdef MyExp
lux=(U16)(Ch0*1.95*myExp(k));
#else
lux=(U16)(Ch0*1.95*exp(k));
#endif
return lux;
这里计算exp(k)的时候,根据实际情况,k在(-9,0),超出的情况直接处理
int mask[] = { 1, 2, 4, 8};
double exps[] =
{
2.718281, // exp(1)
7.389056, // exp(2)
54.59815, // exp(4)
2980.957 // exp(8)
};
double Exponential(double q)
{ // q (almost) in [ -0.5, 0.5 ]
double y = 1, t = q;
char i;
for (i = 1; t != 0; t *= q / ++i) y += t;
return y;
}
double myExp(double x)
{
signed char n;
unsigned char m,i;
double z,y;
n = (x < 0) ? (x-0.5) : (x+0.5);
z = 1;
y = Exponential(x - n);
m=(n < 0) ? -n : n;
for (i = 0; i <4; i++)
if ((m & mask) != 0) z *= exps;
return (n < 0) ? (y / z) : (y * z);
}
上面的程序在vc中作验证
double i=-9.000;
double j,k,err;
for(;i<0;i+=0.001)
{
j=myExp(i);
k=exp(i);
err=j-k;
printf("%9f %9f %9f\r\n",j,k,err);
}
小数点后6位完全一致,输出
0.000123 0.000123 0.000000
0.000124 0.000124 0.000000
0.000124 0.000124 0.000000
0.000124 0.000124 0.000000
0.000124 0.000124 0.000000
0.000124 0.000124 0.000000
0.000124 0.000124 0.000000
0.000124 0.000124 0.000000
0.000124 0.000124 0.000000
。。。。。。。。。。。。。。。。。
0.984127 0.984127 0.000000
0.985112 0.985112 0.000000
0.986098 0.986098 0.000000
0.987084 0.987084 0.000000
0.988072 0.988072 0.000000
0.989060 0.989060 0.000000
0.990050 0.990050 0.000000
0.991040 0.991040 0.000000
0.992032 0.992032 0.000000
0.993024 0.993024 -0.000000
0.994018 0.994018 0.000000
0.995012 0.995012 -0.000000
0.996008 0.996008 0.000000
0.997004 0.997004 -0.000000
0.998002 0.998002 0.000000
0.999000 0.999000 -0.000000
在XC8中编译
用XC8自带的exp
Program space used F36h ( 3894) of 1000h words ( 95.1%)
用我的myExp
Program space used DA4h ( 3492) of 1000h words ( 85.3%)
我不知道你想和我赌什么
去赌梅西进几个球吧
|
|