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
