Java float(32 位)與 double(64 位)為定長表示,無法精確表達所有真實數。極大值(double 最大約 1.8e308)、極小值、精度遺失(如 0.1 累加 10 次不等於 1.0)皆為常見陷阱。IEEE 754 引入 Infinity、NaN、正負零等特殊值,打破傳統數學律(如排中律在 NaN 失效)。
getExponent():取得無偏移指數Math.getExponent(2.0) // 1
Math.getExponent(0.5) // -1
Math.log(x)/Math.log(2) 更快、更精確(避免捨入誤差)。nextUp() / nextAfter():鄰近浮點數nextUp(x) 回傳比 x 大的最小浮點數。nextAfter(start, direction) 依 direction 大小決定方向。ulp(x):最小精度單位float 約 1e7 時 ULP=1.0,超過則多個整數映射同一浮點數。assertEquals(expected, actual, 5*Math.ulp(expected)),自動適應數量級。scalb(x, n):高效 2 的冪次縮放Math.scalb(3, 4) // 3 * 2^4 = 48.0
x * Math.pow(2, n) 但極快(避開 Math.pow 通用算法開銷)。getMantissa():x / Math.scalb(1, getExponent(x))。copySign(magnitude, sign):符號複製(含正負零)-0.0:copySign(10, -0.0) → -10,copySign(10, 0.0) → 10。StrictMath.copySign 保證行為,Math.copySign 實作相同。expm1() / log1p():高精度指數對數變體expm1(x) = e^x - 1:x 接近 0 時極準(避免減法抵銷誤差)。log1p(x) = ln(1+x):同理適用 x 接近 0。浮點數非真實數,精度有限且易生捨入誤差。java.lang.Math 新增方法針對 IEEE 754 特性設計,提供高效、高精度的底層運算構件。科學、工程、金融應用務必善用這些專家級算法,勿自行造輪子。