简易对数求法

来源:互联网 发布:全国地区代码数据字典 编辑:程序博客网 时间:2024/05/21 12:08

设对数...,因为是递增函数。


假设,如果,则,反之则.


由此可得的简易算法如下(计算机程序设计艺术P19):

首先将x的小数点左移或右移,使得;  这样就确定了n.现在置,对于k>=1,置: 


如果, 则

如果, 则 ;


从而我们得到了。由此可以求出的值。代码如下:

#include<stdlib.h>#include<stdio.h>#include <math.h>double log10(double x);void main(){    int i;    for (  i= 100; i<300; i+= 10)    {       printf("%5d  MATH:%2.10f  SELF:%2.10f\n",i,log(i)/log(10),log10(i));    }}double getIntNum(double *pValue){    double a = 1;    double b = 0.1;    double r = 0;    double x = *pValue;    if ( x < 1.0 )    {       a = -a;       b = 10;    }    while ( x >= 10 || x < 1 )    {       r += a;       x *= b;    }    *pValue = x;    return r;}double log10(double x){    double r;    double a = 2;    int i;    r = getIntNum(&x);    for (  i = 0 ; i<40; i++ )    {       x *= x;       if ( x >= 10 )       {           r = r + 1/a;           x /= 10;       }       a *= 2;    }    return r;}


结果如下:

  100  MATH:2.0000000000  SELF:2.0000000000  110  MATH:2.0413926852  SELF:2.0413926852  120  MATH:2.0791812460  SELF:2.0791812460  130  MATH:2.1139433523  SELF:2.1139433523  140  MATH:2.1461280357  SELF:2.1461280357  150  MATH:2.1760912591  SELF:2.1760912591  160  MATH:2.2041199827  SELF:2.2041199827  170  MATH:2.2304489214  SELF:2.2304489214  180  MATH:2.2552725051  SELF:2.2552725051  190  MATH:2.2787536010  SELF:2.2787536010  200  MATH:2.3010299957  SELF:2.3010299957  210  MATH:2.3222192947  SELF:2.3222192947  220  MATH:2.3424226808  SELF:2.3424226808  230  MATH:2.3617278360  SELF:2.3617278360  240  MATH:2.3802112417  SELF:2.3802112417  250  MATH:2.3979400087  SELF:2.3979400087  260  MATH:2.4149733480  SELF:2.4149733480  270  MATH:2.4313637642  SELF:2.4313637642  280  MATH:2.4471580313  SELF:2.4471580313  290  MATH:2.4623979979  SELF:2.4623979979


0 0
原创粉丝点击