演算法 -- 電腦如何計算平方根呢?

演算法

演算法簡介

複雜度理論

系統搜尋法

逼近法

隨機搜尋法

隨機統計法

最佳化

分配濃縮法

遞迴法

分割擊破法

動態規劃法

事前計算法

轉換領域法

轉換問題法

訊息

相關網站

參考文獻

最新修改

簡體版

English

會寫程式的人都知道要如何讓電腦計算二次方 ($x^2$)、三次方($x^3$)等函數,然而、要計算平方根這類的函數,可就沒那麼容易了,這類函數必須採用一種稱為逼近的方式來計算,本文中我們將以開根號這個問題為例,說明電腦如何逼近一個問題的解答。

簡介

電腦計算平方根,必需要採用逼近的方法,所謂逼近的方法,就是用猜測、計算、再猜測、再計算…的方式,其中、每次的猜測都會根據前幾次猜測的結果,會猜的越來越準。

以開根號這個問題為例,假設我們想計算 5 這個數字的平方根,首先我們要先訂出一個範圍,我們知道 $1^2 = 1$$5^2=25$,因此、我們可以用這兩個數值作為起始的邊界值,然後開始利用二分搜尋法,不斷逼近其結果,其過程圖示如下。

sqrt.jpg

上述過程中、我們先計算 (1+5)/2 = 3 的平方,發現 3<sup>2</sup> = 9, 比 5 還大,於是知道5 的平方根必然在 1-3 之間,於是在計算 (1+3)/2 = 2 的平方,發現 $2^2 = 4$,比 5 還小,於是知道 5 的平方根必然在 2-3 之間,如此不斷縮小範圍的結果,就會得到一個愈來愈準的區間,當誤差小的一定程度 (例如: 0.00000000001) ,我們就可以說找到正確結果了。

==實作==
以下我們用 Java 程式實作平方根的計算方法,並以計算 5 的平方根為一個測試範例,程式碼如下:

class Sqrt {
  public static void main(String[] args) throws Exception 
  {
    System.out.println("sqrt(5)="+sqrt(5));
  }
 
  public static double sqrt(double x) throws Exception 
  {
    double small = 0.0000001;
    double low, high;
    if (x < 0) throw new Error();
    if (x < 1) { 
      low = 0; high = 1;  // 若 0 < x < 1 則其平方根必然介於 0 與 1之間。
    } else {
      low = 1; high = x;  // 若 x > 1 , 則其平方根必然介於 1 與 x 之間。
    }
    while (high - low > small)  // 不斷逼近,直到範圍夠小為止。
    {
      double mid = (low + high) / 2;
      if (mid*mid > x)          // 解小於 mid , 將上限調為 mid
        high = mid;
      else
        low = mid;              // 解大於 mid , 將下限調為 mid
    }
    return low;
  }
}

執行結果如下:

D:\myweb\teach\Algorithm>javac Sqrt.java

D:\myweb\teach\Algorithm>java Sqrt
sqrt(5)=2.2360679507255554

D:\myweb\teach\Algorithm>

結語

在本文中,我們示範了如何用逼近法計算平方根,只要活用逼近法,幾乎所有數值問題都可以利用此法解決,包含 3 次方根、4次方根…等等。

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License