简易对数求法

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


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


由此可得的简易算法如下(计算机程序设计艺术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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值