// 唯一內建:自然對數 (底數 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 1.0 | Math.log(double) | 自然對數 |
| JDK 1.5 | Math.log10(double) | 常用對數,比手動換底更精確/快速 |
| JDK 1.5 | Math.log1p(double) | ln(1+x),x 接近 0 時高精度 |
| JDK 9 | Math.log10 內建優化 | 硬體指令支援 |
// 直接使用內建,效能最佳
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)
Math.log10、Math.log1p 經過底層優化value <= 0 拋異常,value = Double.MAX_VALUE 可能溢位log(base) 可快取,如 static final double LN_10 = Math.log(10);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)。理解對數在資訊論、演算法、科學計算中的應用,能寫出更優雅高效的數學代碼。