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

Java 對數運算完整指南:Math.log、換底公式與常用封裝工具類

     編輯:Java 相關知識

JDK 內建支援

// 唯一內建:自然對數 (底數 e)
double ln5 = Math.log(5); // ≈ 1.6094379124341003
// 等價:ln 5 或 log_e(5)

缺口:無直接支援 log10 (常用對數)、log2 (二進位對數) 或任意底數。

數學基礎:換底公式

log_a(b) = ln(b) / ln(a) = log_c(b) / log_c(a) (任意底數 c)

通用工具類實現

package com.example.math;

public final class Logarithm {
    private Logarithm() {} // 工具類防實例化
    
    /**
     * 任意底數對數
     * @param value 真數 (> 0)
     * @param base 底數 (> 0 且 ≠ 1)
     * @return log_base(value)
     */
    public static double log(double value, double base) {
        if (value <= 0) throw new IllegalArgumentException("真數必須 > 0: " + value);
        if (base <= 0 || base == 1) throw new IllegalArgumentException("底數必須 > 0 且 ≠ 1: " + base);
        return Math.log(value) / Math.log(base);
    }
    
    /** 常用對數 (底數 10) */
    public static double log10(double value) {
        return log(value, 10.0);
        // JDK 1.5+ 可直接用 Math.log10(value)
    }
    
    /** 二進位對數 (底數 2) */
    public static double log2(double value) {
        return log(value, 2.0);
    }
    
    /** 自然對數 (底數 e) - 語意別名 */
    public static double ln(double value) {
        return Math.log(value);
    }
}

使用範例

// log_10(100) = 2
double log100 = Logarithm.log10(100); // 2.0

// log_2(512) = 9
double log512 = Logarithm.log2(512); // 9.0

// log_3(81) = 4
double log81 = Logarithm.log(81, 3); // 4.0

// 資訊熵計算:H = -Σ p * log2(p)
double entropy = - (0.5 * Logarithm.log2(0.5) + 0.5 * Logarithm.log2(0.5)); // 1.0

JDK 版本演進

版本新增方法備註
JDK 1.0Math.log(double)自然對數
JDK 1.5Math.log10(double)常用對數,比手動換底更精確/快速
JDK 1.5Math.log1p(double)ln(1+x),x 接近 0 時高精度
JDK 9Math.log10 內建優化硬體指令支援

現代寫法 (JDK 1.5+)

// 直接使用內建,效能最佳
double log10 = Math.log10(1000); // 3.0
double ln = Math.log(Math.E);    // 1.0
double log1p = Math.log1p(1e-10); // 高精度 ln(1+1e-10)

精度與效能考量

  1. 優先使用內建方法:Math.log10、Math.log1p 經過底層優化
  2. 極值處理:value <= 0 拋異常,value = Double.MAX_VALUE 可能溢位
  3. 避免重複計算:log(base) 可快取,如 static final double LN_10 = Math.log(10);
  4. 大數對數:log(a * b) = log(a) + log(b) 避免溢位

應用場景

領域公式用途
資訊理論H = -Σ p log₂ p熵、互資訊、資料壓縮
演算法分析O(log₂ n)二分搜尋、平衡樹高度
聲音/光度dB = 20 log₁₀(A/A₀)分貝計算
金融數學ln(P_t/P_0)連續複利收益率
機器學習Log Loss = -[y ln(p) + (1-y) ln(1-p)]分類損失函數

總結

Java 對數運算核心是 Math.log (自然對數) 配合換底公式。JDK 1.5+ 內建 log10、log1p,現代開發優先使用內建方法,僅在需要任意底數時封裝 log(value, base)。理解對數在資訊論、演算法、科學計算中的應用,能寫出更優雅高效的數學代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved