快速业务通道

创建Java ME Math.pow()方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
enominator, 1024.*/    double n = Double.MAX_VALUE; /* we initialize our          estimate, setting it to max*/    while( n >= Double.MAX_VALUE && iterations > 1)    {      /* We try to set our estimate equal to the right      hand side of the equation (e.g., 8^2048). If this      number is too large, we will have to rescale. */      n = x;      for( int i=1; i < num; i++ )n*=x;      /*here, we handle the condition where our starting      point is too large*/      if( n >= Double.MAX_VALUE )      {        iterations--; /*reduce the iterations by one*/        den = (int)(den / 2); /*redefine the denominator*/        num = (int)(y*den); //redefine the numerator      }    }    /*************************************************    ** We now have an appropriately sized right-hand-side.    ** Starting with this estimate for n, we proceed.    **************************************************/    for( int i = 0; i < iterations; i++ )    {      n = Math.sqrt(n);    }    // Return our estimate    return n; }

创建Java ME Math.pow()方法(4)

时间:2011-07-20 aniel Williams

自然对数和欧拉 e 的泰勒级数逼近

对于正实数产生 Math.pow() 方法最简便的方式之一是链接几个方法,包括使用 泰勒级数。假定我们需要幂 y = xb。该式与 ln(y) = b*ln(x) 等价。进而,我们可以使用泰勒级数扩展估算 x 的自然对数,如下所示。

ln(x) = (x-1) –(x-1)2/2 + (x-1)3/3 - (x-1)4/4….if |x-1|<=1 OR ln(x) = 1/(x/(x-1)) + 1/(x/(x-1))2 + 1/(x/(x-1))3… if |x|>1

由于 x 为正,因而 x 的整个域为这些方程所覆盖。此交错级数可以提供对底数对数的非常接近的逼近。用指数乘以此对数将得到 ln(y), 方程的右侧 ln(y)=b*ln(x)。现在,我们仅需求出 eln(y) 即可完成运算。我们使用另一个泰勒级数扩展来完成此过程:ex = 1 + x + x2 / 2! + x3 / 3! + … 使用这两个公式,即可求得问题的解,如示例 8 所示。

示例 8 double pow(double a, double b) {    // true if base is greater than 1    boolean gt1 = (Math.sqrt((a-1)*(a-1)) <= 1)? false:true;    int oc = -1; // used to alternate math symbol (+,-)    int iter = 20; // number of iterations    double p, x, x2, sumX, sumY;    // is exponent a whole number?    if( (b-Math.floor(b)) == 0 )    {      // return base^exponent      p = a;      for( int i = 1; i < b; i++ )p *= a;      return p;    }    x = (gt1)?        (a /(a-1)): // base is greater than 1        (a-1); // base is 1 or less    sumX = (gt1)?        (1/x): // base is greater than 1        x; // base is 1 or less    for( int i = 2; i < iter; i++ )    {      // find x^iteration      p = x;      for( int j = 1; j < i; j++)p *= x;      double xTemp = (gt1)?          (1/(i*p)): // base is greater than 1          (p/i); // base is 1 or less      sumX = (gt1)?          (sumX+xTemp): // base is greater than 1          (sumX+(xTemp*oc)); // base is 1 or l

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号