+ -
当前位置:首页 → 问答吧 → 请教lg的计算方法

请教lg的计算方法

时间:2011-08-02

来源:互联网

因为项目使用的系统不支持lg计算,也不能使用库函数math,各位大侠谁能提供一个算法,尽量说得详细点,本人菜鸟。
想在需要知道Lg(x)如何求出其值。

作者: guven   发布时间: 2011-08-02

不懂,帮顶!

作者: mingpei0703   发布时间: 2011-08-02

假设 1<x<10,计算过程是:
STEP1: 令 lg(x)=S;
STEP2: 则有 2*lg(x)=2*S, 即 lg(x^2)=2*S;
STEP3: 若 x^2<10,则转 STEP2,直到 X^2>=10;
STEP4: 现在,lg(XX)=m*S,且 XX>=10,令 XX=10*y,则上式可写成
  1+lg(y)=m*s;
STEP5: 只要 m 不够大,继续对两边剩以 2 ,若 lg(XX)中的 XX 大于 10,就把它拆开,直到
  n+log(z)=m*S 中的 m 跳够大,则 S 约等于 n/m

程序如下:

double Lg(double x)
{
  double m=1.0;
  double n=0.0;

  while (m<1.0E+10)
  {
  m+=m;
  x*=x;
  if (x>=10)
  {
  n+=1.0;
  x/=10.0;
  }
  }
  return n/m;
}

若 x 不在[1,10]之间,楼主只要做个预处理就可以了,这里,代码从略.

作者: icessl   发布时间: 2011-08-02

用各种展开。taylor展开 ,傅里叶展开。

已知 lg(1)=0,lg(a*b)=lg(a)+lg(b).
又知道lg(x)导数序列(一阶,二阶...)为 1/x,-1/x^2,2/x^3.... (-1)^(n-1)*(n-1)!/x^n 
1,对任意x 属于 (0,2)。<0x<2 taylor展开如下

  lg(x)=lg(1)+(1/1)*(x-1)/1!-(1/1^2)*(x-1)^2/2!+.....(-1)^(n-1)*(n-1)!*(x-1)^n/1^n/n!  
  注意到最后一项 可以化简为(x-1)^n/n 是趋于0的。所以精度可以自己控制。取决与你计算n到第几次。

2,对x>=2 。应为有公式 lg(a*b)=lg(a)+lg(b)。总是可以将x转化为小于2的几个乘机来计算

作者: namewchwch   发布时间: 2011-08-02

求lna 就是求e^x-a=0的解
e^x的导数仍为e^x 由牛顿迭代法 x'=x-(e^x-a)/e^x=x-1+a/e^x
反正对数底不同的话,无非就是最后结果差个常数再乘进去就行了

作者: cfvmario   发布时间: 2011-08-02

热门下载

更多