ホーム > Java > Javaで固定小数点の計算

Javaで固定小数点の計算

JavaでWebアプリケーションを作成している場合は、小数点の計算には、浮動小数点のfloat型やdouble型を使い、お金の計算には、java.math.BigDecimal 型が使われます。またサーバ用コンピュータとしてある程度ハードウェアの性能が期待できるのと、保守性を考慮して、上記の型を使います。

近年、Google 製の携帯電話が発売されましたが、携帯電話でぎりぎりまで性能を引き出すには、固定小数点での計算が有力だそうです。以下にAndroid携帯でのゲーム開発について解説があるのですが、パフォーマンスチューニングのために、関数を使わないや、固定小数点を使うなどは普段Webアプリケーションでは考慮しない事なのでとても興味深いです。

Android でリアルタイムゲームの開発方法 : Google Developer Day 2009 Japan ,スピーカー : クリス プルエット

/**
 * Javaで固定小数点の計算.
 * @author Satoshi Okita
 * 参考資料:
 * 固定小数   http://www.sage-p.com/compone/toda/fixdec.htm
 * 整数化小数 http://www.geocities.co.jp/Berkeley/2093/clab.html
 * 固定小数点 http://www2s.biglobe.ne.jp/~nuts/labo/daal/daal07.html
 * Javaでfixpointのライブラリを作っている方がいました。三角関数も実装されています。
 * http://blog.numfum.com/2007/09/java-fixed-point-maths.html
 */
public class FixpointTest {

    /**
     * @param args
     */
    public static void main(String[] args) {

        // 整数の計算.
        int five = 5;                        // 0000 0000 0000 0000, 0000 0000 0000 0101 (32bit)
        int ffive= Fixpoint.int2fix(five);    // 0000 0000 0000 0000, 0000 0101 0000 0000 (32bit)
        int rfive = Fixpoint.fix2int(ffive);// 0000 0000 0000 0000, 0000 0000 0000 0101 (32bit)
        System.out.println("整数5をそのまま表示した値=" + five);
        System.out.println("整数5をfixpointで表した値=" + ffive);
        System.out.println("整数5をfixpointから戻した=" + rfive);

        // 小数点のある値の計算.
        // 小数を代入するときは、2のシフト数乗をかけた値を指定
        int f   = Fixpoint.fvalue(1.23f);
        System.out.println("小数1.23をfixpointで表現 =" + f);

        // fixpoint型での加算. 5+1.23
        int fixr = ffive + f;

        System.out.println("小数6.23をfixpointで表した値=" + fixr);

    }

}

final class Fixpoint {
    public static int FIX_POINT  = 8;

    public static int fvalue(float fx) {
        int r = 2;
        for (int i = 2; i <= FIX_POINT; i++) {
            r = r * 2;
        }
        System.out.println("r=" + r);
        return (int)(fx * r);
    }

    public static int int2fix( int x ) {
        // return value = x * 2のFIX_POINT乗
        // 例) return value = x * 2^8 (Javaでは^はサポートされていない)
        return x << FIX_POINT;
    }
    public static int fix2int( int x ) {
        return x >> FIX_POINT;
    }

    public static int multiply( int x, int y ) {
        return (int)(( ( long )x * ( long )y ) / FIX_POINT);
    }

    public static int divide( int x, int y ) {
        return (int)(( ( long )x * FIX_POINT ) / ( long )y);
    }
}
カテゴリー: Java タグ:
  1. コメントはまだありません。
  1. トラックバックはまだありません。