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

J2ME 定點運算庫 MathFP 入門:在無浮點裝置上實現精準小數計算

     編輯:Java 程式設計入門

CLDC 1.0 不支援浮點運算,導致早期 Java ME 裝置無法直接處理小數。MathFP 以整數模擬定點運算,成為 J2ME 環境下小數計算的最佳解決方案——體積小、效能高、API 完整。本文將從原理到實戰,帶您快速上手。

核心概念:定點數表示法

MathFP 將小數以 整數形式儲存,內部採用 16.16 定點格式(高 16 位整數部、低 16 位小數部)。開發者需遵守鐵律:

「參與運算的整數必須先轉為定點數(toFP),運算完成後再轉回整數(toInt)使用。」

命名建議:定點數變數以 _FP 為後綴(如 x_FP),避免與純整數混淆。

環境建置

  1. 下載 MathFP.class(套件 net.jscience.util),官網:MathFP 專案頁。
  2. 將 class 檔加入 classpath 或反編譯為原始碼置入專案 src 目錄。
  3. 同步下載 API 文件備查。

實戰範例:繪製 60 度角軌跡動畫

模擬一點每 100ms 以 5 像素速度沿 60° 方向移動,需用三角函數計算增量:

  • x 增量 = RATE * cos(60°)
  • y 增量 = RATE * sin(60°)

完整程式碼:FloatCanvas.java

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import net.jscience.util.MathFP;

public class FloatCanvas extends Canvas implements Runnable {
    int paintCount;
    int w_FP, h_FP;           // 螢幕寬高(定點數)
    int curX_FP, curY_FP;     // 當前座標
    int lastX_FP, lastY_FP;   // 前一座標
    public static final int RATE = 5; // 速率 5 像素

    public FloatCanvas() {
        w_FP = MathFP.toFP(getWidth());
        h_FP = MathFP.toFP(getHeight());
        lastX_FP = MathFP.toFP(0);
        lastY_FP = h_FP; // 左下角起始
        new Thread(this).start();
    }

    protected void paint(Graphics g) {
        if (paintCount == 0) {
            g.setColor(0);
            g.fillRect(0, 0, getWidth(), getHeight());
        } else {
            g.setColor(0x00FF00);
            // 定點數轉整數繪製線段
            g.drawLine(MathFP.toInt(lastX_FP), MathFP.toInt(lastY_FP),
                       MathFP.toInt(curX_FP), MathFP.toInt(curY_FP));
        }
        paintCount++;
    }

    public void run() {
        while (curX_FP <= w_FP && curY_FP <= h_FP &&
               MathFP.toInt(curX_FP) >= 0 && MathFP.toInt(curY_FP) >= 0) {
            // 角度轉弧度:radians = 60 * PI / 180
            int radians = MathFP.div(MathFP.mul(MathFP.toFP(60), MathFP.PI),
                                     MathFP.toFP(180));
            // 計算增量
            int deltaX = MathFP.mul(MathFP.toFP(RATE), MathFP.cos(radians));
            int deltaY = MathFP.mul(MathFP.toFP(RATE), MathFP.sin(radians));
            // 更新座標
            curX_FP = lastX_FP + deltaX;
            curY_FP = lastY_FP - deltaY; // Y 軸向下為正
            repaint();
            try { Thread.sleep(100); } catch (InterruptedException e) {}
            lastX_FP = curX_FP;
            lastY_FP = curY_FP;
        }
    }
}

關鍵 API 對照表

MathFP 方法對應數學運算範例
toFP(int)整數 → 定點數MathFP.toFP(5)
toInt(int)定點數 → 整數(截斷)MathFP.toInt(x_FP)
add/sub/mul/div基本四則運算MathFP.mul(a_FP, b_FP)
sin/cos/tan三角函數(參數為弧度定點數)MathFP.sin(rad_FP)
PIπ 常數(定點數)MathFP.PI

應用延伸

有了 MathFP,J2ME 遊戲即可實現:物理拋物線、向量旋轉、碰撞檢測、粒子系統等進階算法,突破「唯有整數」的限制。

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