首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 平方根與立方根算法實現:牛頓迭代法原理與高精度代碼詳解

     編輯:Java 相關知識

本文實現不依賴 Math.sqrt() 的平方根、立方根計算,基於牛頓迭代法(Newton-Raphson Method),支持任意精度與負數處理,附帶完整可運行代碼。

牛頓迭代法數學原理

求解 f(x) = 0 的根,迭代公式:x_{n+1} = x_n - f(x_n)/f'(x_n)

  • 平方根:解 x² - c = 0 → x_{n+1} = (x_n + c/x_n) / 2
  • 立方根:解 x³ - c = 0 → x_{n+1} = (2x_n + c/x_n²) / 3(代碼採用等價變形)

核心代碼實現

public class Algorithms {
    /** 平方根:牛頓法迭代,精度 1e-15 */
    public static double sqrt(double c) {
        if (c < 0) return Double.NaN;
        double err = 1e-15;
        double t = c;
        while (Math.abs(t - c / t) > err * t) {
            t = (c / t + t) / 2.0;
        }
        return t;
    }

    /** 立方根:處理負數符號,同樣牛頓迭代 */
    public static double cbrt(double c) {
        boolean positive = c > 0;
        c = positive ? c : -c;
        double err = 1e-15;
        double t = c;
        while (Math.abs(t * t - c / t) > err * t) {
            t = (c / (t * t) + t) / 2.0; // 等價於 (2t + c/t²)/3
        }
        return positive ? t : -t;
    }

    public static void main(String[] args) {
        System.out.println("sqrt(4.0) = " + sqrt(4.0));   // 2.0
        System.out.println("cbrt(-27.0) = " + cbrt(-27.0)); // -3.0
    }
}

關鍵細節解析

細節處理方式
負數輸入sqrt 返回 NaN;cbrt 記錄符號,轉正數計算後恢復符號
收斂條件相對誤差 |t - c/t| > err * t,避免絕對誤差在大數下過嚴、小數下過鬆
初始值選擇直接用 c,牛頓法對凸函數全域收斂
精度控制1e-15 接近 double 機器極限(~1e-16)

擴展:任意 n 次方根

通用公式:x_{k+1} = ((n-1)x_k + c / x_k^{n-1}) / n。偶次方根需檢查 c >= 0,奇次方根同立方根處理符號。

性能對比

  • JDK Math.sqrt() 為硬件指令優化,速度極快
  • 純 Java 迭代約需 5-10 次循環收斂,適合教學、無標準庫環境、或需自定義精度場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved