使用 Java 開發行動裝置應用程式時,可能需要用到特定 Java VM 所沒有的數學方法。本文將專門解決 Java ME 沒有“冪”方法 Math.pow() 的問題。我們將示範使用三種不同的方法開發同一個 ME 應用程式,並從中選出最佳的編程解決方案。
要討論此問題,我們先考察整數和分數冪參數,將我們的分析限於正實數。我們將示範求整數問題和小數問題的解集相對而言比較容易(而 不考慮指數的符號)。在大多數情況下,我們將使用樣本問題 n = 82/3,其中我們會求出 n 的良好估計或實際解。如果初始指數事先不可用 ,則此問題的其他解(包括牛頓法和割線法)不易編程。雖然二分法是可行的解決方案,但我們將關注傳統上不為人所探究的三個方法。第一 個是簡單的(不過有時效率低下)幾何衰變演算法;而第二個方法將利用 Math.sqrt() 方法並保證在不超過 11 次迭代中收斂到一個近似解。第 三個方法將使用泰勒級數逼近法求對數並對泰勒級數進行歐拉轉換。
產生整數解的 ME Math.pow() 方法
傳統上,Java Math.pow() 方法包含兩個參數。這兩個參數包括底數和指數。我們假定(最初)這兩個參數均為整數,然後求出 ME 中與 Java 方法使用相同參數的 Math.pow() 方法的可程式化解。此處,可程式化解相當簡單,如樣本 1 所示。在本例中,我們僅運行以指數值為指標 的倍乘迴圈。
樣本 1
int pow( int x, int y) /*we define the power method with
base x and power y (i.e., x^y)*/
{
int z = x;
for( int i = 1; i < y; i++ )z *= x;
return
}
當然,有人可能會發現需要求出非整數冪的值。正實數的簡單解(無需訪問 Math.pow() 方法)可能涉及使用 Math.log()。例如,請考慮 82/3 的情況。利用 2/3*ln(8) = 1.386294361 中自然對數的結果。要得到最終解,需要利用指數 1.386294361(特別指出 e1.386294361 = 4 )。在這種情況下,可能不需要使用冪函數。遺憾的是,Java ME 也不支援 Math.log() 方法。沒有 Math.pow() 或 Math.log() 方法時,我 們會考慮使用樸素的“強力”試探性方法,應用 Math.sqrt() 方法以及自然對數(和歐拉 e)的泰勒級數逼近來求得 Java ME 問題的解。
使用幾何衰變演算法作為強力解的 ME Math.pow()
Java ME 的早期實現包括浮點主要資料類型 float 和 double。最近,已添加了這些類型。現在我們將 Math.pow() 聲明中的整型參數替換為 double 資料類型。
可能需要在 Java ME Math.pow() 冪方法中使用小數指數。我們提供的產生 Math.pow() 的第一種方法是使用幾何衰變演算法的樸素的“強力 ”試探性方法。簡單而言,衰變演算法以一個大於已知解的值開始,然後應用某個方法來衰變該值,直到該值非常逼近該解(有關簡單線性衰變 演算法的示範,請參見樣本 2)。在我們的例子中,將進一步示範向上述解收斂的幾何形式。
樣本 2
/* 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 = 1000; //assume that we know the solution is less than or equal to 1000
while( varX > 0 )
{
varX -= 1; // decrement by 1
if( varX == n)return varX;
}
在樣本 2 中,我們從 1000 開始遞減,直到找到預期的數字,假定預期數字是一個正整數。這種類型的演算法構成了強力試探性方法的基礎 。