快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
op    while( n > 0 )    {      double a = n; //proxy for n      // find ''a'', the value of ''n'' to the power of denominator      for( int i = 1; i < den; i++ )a *= n;      // compare ''a'' to ''z''. Is the value within the hundred-thousandth?      // if so, return ''n''.      double check1 = a-z;      double check2 = z-a;      if( check1 < .00001|| check2 > .00001 ) return n;      n *= .999;// We arbitrarily use a decay of .1% per iteration    }    // value could not be found, return -1.    return -1.0; }

本示例演示了衰变算法的使用方法。您会注意到,n 的值(解的估计值)将按 1% 强制递减。您可能需要根据编程精度要求来改变此值。也 可能考虑包括编程逻辑,该逻辑用于将前一迭代解与当前迭代进行比较,然后,如果有改善继续进行迭代,但是,如果解已回归,则返回前一 个值。

这里讲述的解只处理正指数。如果值为负会出现什么情况呢?下面我们将解决这种意外情况。

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

时间:2011-07-20 aniel Williams

处理负指数

要再增加一层复杂度,假定正在向 Math.pow() 方法传递负指数。在这种情况下,指数为负,一种简单的解决方案是将底数转换为小数,使 指数为正。例如,8-2 可转换为 (1/8)2。我们以可编程的方式用底数 x 来除 1,用 -1 来乘 y(参见示例 6)。

示例 6 if( y < 0 ) {    x = (1/x); // convert base number to fraction    y *= -1; // make exponent positive }

现在,我们已经讨论了用于在 Java ME 中估计幂函数的“强力”几何衰变算法。读者会注意到,对于较大的底数和指数分子组合,朴素的 “强力”试探性方法有性能问题。请考虑示例 85/2。使用此算法的起始值将为 85 = 32,768。如果使用 1% 的衰变,则要求全部 5196 次迭代 都求该解,这样几乎达不到最优。谨记此事实并且不提供改善的试探性搜索算法,我们转到二次逼近,这会提供更多合理的迭代要求。

使用 Math.sqrt() 方法的 ME Math.pow()

开发我们的 Math.pow() 方法的第二种方法是通过使用 Math.sqrt() 方法(参见示例 7)。使用Math.sqrt() 方法要求我们对具有偶分母 的幂进行估计。例如,n = 82/3 => n3 = 82 是一个棘手问题,因为我们需要立方根,而非平方根。为了调整示例中的此问题,我们我们就 对两端再求一次平方:n3 = 82 => n6 = 84。然后,我们就可以继续进行,恰好在两次迭代之内求出解。

当然,我们的 ME Math.pow() 方法的指数不会以分子和分母的形式开始,而是向我们传递一个实数。我们将此实数转换为具有偶分母的小 数,然后利用相应的平方根数来对 n 求解。在我们的 n = 82/3 示例中,我们进行如下转换:

n = 82/3 => n = 8683/1024 => n1024 = 8683

我们选择 1024 作为分母,因为对平方根函数迭代 10 次将得到 n 的值。特别指出,(n1024)(1/(2^10)) = n。当然,我们可能需要根据方 程右侧的大小来减少迭代次数。示例 7 演示了这种方法。

示例 7 double pow(double x, double y) {         //Convert the real power to a fractional form    int den = 1024; //declare the denominator to be 1024    /*Conveniently 2^10=1024, so taking the square root 10    times will yield our estimate for n. In our example    n^3=8^2  n^1024 = 8^683.*/    int num = (int)(y*den); // declare numerator    int iterations = 10; /*declare the number of square root      iterations associated with our d

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号