熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java ME中的Math.pow()方法使用詳解

2013-11-23 19:24:37  來源: Java核心技術 

  

  使用 Java 開發移動設備應用程序時可能需要用到特定 Java VM 所沒有的數學方法本文將專門解決 Java ME 沒有方法 Mathpow() 的問題我們將演示使用三種不同的方法開發同一個 ME 應用程序並從中選出最佳的編程解決方案

  要討論此問題我們先考察整數和分數冪參數將我們的分析限於正實數我們將演示求整數問題和小數問題的解集相對而言比較容易(而不考慮指數的符號)在大多數情況下我們將使用示例問題 n = /其中我們會求出 n 的良好估計或實際解如果初始指數事先不可用則此問題的其他解(包括牛頓法和割線法)不易編程雖然二分法是可行的解決方案但我們將關注傳統上不為人所探究的三個方法第一個是簡單的(不過有時效率低下)幾何衰變算法而第二個方法將利用 Mathsqrt() 方法並保證在不超過 次迭代中收斂到一個近似解第三個方法將使用泰勒級數逼近法求對數並對泰勒級數進行歐拉轉換

  產生整數解的 ME Mathpow() 方法

  傳統上Java Mathpow() 方法包含兩個參數這兩個參數包括底數和指數我們假定(最初)這兩個參數均為整數然後求出 ME 中與 Java 方法使用相同參數的 Mathpow() 方法的可編程解此處可編程解相當簡單如示例 所示在本例中我們僅運行以指數值為指標的倍乘循環

  示例

  int pow( int x int y) /*we define the power method with  
   base x and power y (ie x^y)*/ 
   {  
   int z = x;  
   for( int i = ; i < y; i++ )z *= x;  
   return 
   }  

  當然有人可能會發現需要求出非整數冪的值正實數的簡單解(無需訪問 Mathpow() 方法)可能涉及使用 Mathlog()例如請考慮 / 的情況利用 /*ln() = 中自然對數的結果要得到最終解需要利用指數 (特別指出 e = 在這種情況下可能不需要使用冪函數遺憾的是Java ME 也不支持 Mathlog() 方法沒有 Mathpow() 或 Mathlog() 方法時我們會考慮使用樸素的強力試探性方法應用 Mathsqrt() 方法以及自然對數(和歐拉 e)的泰勒級數逼近來求得 Java ME 問題的解

  使用幾何衰變算法作為強力解的 ME Mathpow()

  Java ME 的早期實現包括浮點主數據類型 float 和 double最近已添加了這些類型現在我們將 Mathpow() 聲明中的整型參數替換為 double 數據類型

  可能需要在 Java ME Mathpow() 冪方法中使用小數指數我們提供的生成 Mathpow() 的第一種方法是使用幾何衰變算法的樸素的強力試探性方法簡單而言衰變算法以一個大於已知解的值開始然後應用某個方法來衰變該值直到該值非常逼近該解(有關簡單線性衰變算法的演示請參見示例 在我們的例子中將進一步演示向上述解收斂的幾何形式

  示例

  /* This example illustrates a simplistic decay algorithm that we will assume  
   converges to our desired solution (a positive integer) */ 
   int n; // assume that n is the solution to the number we are trying to find  
   int varX = ; //assume that we know the solution is less than or equal to   
   while( varX >  )  
   {  
   varX ; // decrement by   
   if( varX == n)return varX;  
   } 

  在示例 我們從 開始遞減直到找到預期的數字假定預期數字是一個正整數這種類型的算法構成了強力試探性方法的基礎

  使用類似的方法我們可在遇到小數時應用此算法假定我們需要求出 n 的值其中 n = /要使用衰變算法我們必須首先找到一個合適的起點該點要等於或大於解本身這對於帶有正指數的正實數很容易做到對於我們的示例要對此解進行編程對方法兩邊求立方得到 n= 當然此方程與 n= 等效之後我們的起始值將變為 我們知道 n 必須小於 (因為 n = 注意如果限於正實數則此推導方法同樣適用於任何正指數值現在我們可能需要設計一個循環來產生 n 的充分接近預期數字的解我們再來看示例 它適合於所有正底數和正指數

  示例

  double pow( double x double y ) //we define our new power method for fractions  
   {  
   int den = ; // specify arbitrary denominator  
   int num = (int)(y*den); // find numerator  
   int s = (num/den)+;  
   /***********************************************************************  
   ** Variable s provides the power for which we multiply the base to find  
   ** our starting search value For example if we seek a solution for  
   ** n = ^(/) then we will use ^ or  as our starting value (which is  
   ** generated in our next section of code) Why? The solution for our  
   ** problem (given that the base is positive) will always be less than or  
   ** equal to the base times the numerator power  
   ************************************************************************/ 
   /***********************************************************************  
   ** Because we set the denominator to an arbitrary high value  
   ** we must attempt to reduce the fraction In the example below  
   ** we find the highest allowable fraction that we can use without  
   ** exceeding the limitation of our primitive data types  
   ************************************************************************/ 
   double z = DoubleMAX_VALUE;  
   while( z >= DoubleMAX_VALUE )  
   {  
   den =; // decrement denominator  
   num = (int)(y*den); // find numerator  
   s = (num/den)+; // adjust starting value  
   // find value of our base number to the power of numerator  
   z = x;  
   for( int i = ; i < num; i++ )z *= x;  
   }  
   /***********************************************************************  
   ** Now we are going to implement the decay algorithm to find  
   ** the value of n  
   ************************************************************************/ 
   /***********************************************************************  
   ** We now find n to the power of s We will then decrement n  
   ** finding the value of n to the power of the denominator This  
   ** value variable a will be compared to z If the a is nearly  
   ** equal to z then we will return n our desired result  
   ************************************************************************/ 
   double n = x; // We define n as our return value (estimate) for x  
   // find n to the power of s  
   for( int i = ; i < s; i++)n *= x;  
   // Begin decay loop  
   while( n >  )  
   {  
   double a = n; //proxy for n  
   // find a the value of n to the power of denominator  
   for( int i = ; i < den; i++ )a *= n;  
   // compare a to z Is the value within the hundredthousandth?  
   // if so return n  
   double check = az;  
   double check = za;  
   if( check < || check >  ) return n;  
   n *= ;// We arbitrarily use a decay of % per iteration  
   }  
   // value could not be found return   
   return ;  
   } 

  本示例演示了衰變算法的使用方法您會注意到n 的值(解的估計值)將按 % 強制遞減您可能需要根據編程精度要求來改變此值也可能考慮包括編程邏輯該邏輯用於將前一迭代解與當前迭代進行比較然後如果有改善繼續進行迭代但是如果解已回歸則返回前一個值

  這裡講述的解只處理正指數如果值為負會出現什麼情況呢?下面我們將解決這種意外情況

  處理負指數

  要再增加一層復雜度假定正在向 Mathpow() 方法傳遞負指數在這種情況下指數為負一種簡單的解決方案是將底數轉換為小數使指數為正例如 可轉換為 (/)我們以可編程的方式用底數 x 來除 來乘 y(參見示例

  示例

  if( y <  )  
   {  
   x = (/x); // convert base number to fraction  
   y *= ; // make exponent positive  
   } 

  現在我們已經討論了用於在 Java ME 中估計冪函數的強力幾何衰變算法讀者會注意到對於較大的底數和指數分子組合樸素的強力試探性方法有性能問題請考慮示例 /使用此算法的起始值將為 = 如果使用 % 的衰變則要求全部 次迭代都求該解這樣幾乎達不到最優謹記此事實並且不提供改善的試探性搜索算法我們轉到二次逼近這會提供更多合理的迭代要求


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26818.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.