设对数...,因为
是递增函数。
假设,如果
,则
,反之则
.
由此可得的简易算法如下(计算机程序设计艺术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