对于不支持浮点型的10log10运算实现

来源:互联网 发布:name域名隐私 编辑:程序博客网 时间:2024/05/17 15:40

#include <stdio.h>#include <stdlib.h>#include <ctype.h>unsigned int uint10log10(unsigned int value);void main(int argc,char* argv[]){if(argc<2){printf("Please usage:10log10.exe value\n");return;}else{int i = 0;while(argv[1][i]){if(isdigit(argv[1][i])){++i;continue;}else{printf("the type of intput value is not unsigned int\n");return;}}unsigned int value = atoi(argv[1]);unsigned int ret10log10 = uint10log10(value);printf("\n10log(%u)=%u\n",value,ret10log10);}}/*get a rough value because the type is not float *but the biggest margin of error is 3 */unsigned int uint10log10(unsigned int value){unsigned int retlog = 0;while(value > 10 || value == 10 ){++retlog;value /= 10;}retlog *= 10;//value = pow(value,10); pow require the type of value is float or doublevalue *= value;value = value * value * value * value * value; //ugly but fast.while(value > 10 || value == 10 ){++retlog;value /= 10;}return retlog;}


误差最大值为3,分析如下

假设值x=k*10^p + m,

令k^10=f*10^q

上述算法分两步:先求出最高位,可看成求10log(k*10^p),忽略了最高位后面的值m。由于k的值小于10,先对其求10次方在求log,10log(k)=q+logf;

那上述算法实际求解的结果为10p+q

由上述的求解步骤可知误差值由两部分组成,m和log(f)

先来看第一步,令m=l*10^p, l小于1。X=(k+l)*10^p,第一步的误差值就为10log(1+l/k)。整体误差值就为10log(1+l/k)+ logf<10log(1+1/k)+log(f)。

f的值与k有关

kf10log(1+1/k)log(f)biggest margin1110log(2)03.0121.02410log(3/2)0.011.7735.904910log(4/3)0.772.0241.04857610log(5/4)0.020.9959.76562510log(6/5)0.991.7866.046617610log(7/6)0.781.4572.8247524910log(8/7)0.451.0381.07374182410log(9/8)0.030.5493.48678440110log(10/9)0.541

因此误差最大值为3 当最高位k=1,m接近于1*10^p次方时达到

原创粉丝点击