double/float の無い世界の暮らし方

[目次|前回|次回|携帯Javaのページ ] Time-stamp: "2003/11/11 Tue 18:37 hig"

Canvas に(楕)円(弧)を描くことを考えましょう. DoJa3.0(505i)以降のiアプリ, およびMIDPの場合には, drawArc というメソッドが用意されているのでこれを使えばいいです. しかし, DoJa3.0 未満や EZアプリの場合には, sin, cos を使って細かい折れ線として描くことになります.

しかし, iアプリ/Vアプリ/EZアプリの従う J2ME CLDC1.0 には, sin, cos 関数はありません. そこで, 数表をおぼえておくか, Taylor 級数で計算することになります.

さらに, 数表をおぼえておく, Taylor 級数で計算するといっても J2ME CLDC1.0 には, double/float 型がないので, 工夫が必要です. sin q=x/100000 のような分数だと思って, 整数 x をおぼえることにします. このように表現された実数に演算をするときは, 順序をよく考えなくてはいけません. int の間の演算では, ( 10 * 100 ) / 1000=1000/1000=1, 10 * (100 / 1000) = 10 * 0 = 0 です. 一般に, オーバーフローしない範囲で, 割り算は最後に1回だけ行う, ようにするのがいいでしょう.

なお, Vアプリは独自拡張で固定小数点クラス FixedPoint と, FixedPoint オブジェクトに対する sin, cos などのメソッドを持っています. しかし, これらは J2ME Wireless Toolkit の中からは使用できず, compiler や preverifier をコマンドラインで使用しなければなりません. ここでは, これらのメソッドは使わないことにします. また, CLDC1.1 では, double 型がサポートされるそうです. また, J2ME CLDC1.0 に(すなわち,iアプリ/Vアプリ/EZアプリ共通に) 固定小数点クラスを追加するクラスライブラリ MathFP というものが存在します. 樋口はもっぱらこちらを使っています. 樋口による解説

ここで, この配列 sin, cos は, J2SE の プログラム で作りました.

penguin15% javac TrigTable.java
penguin15% java TrigTable > table 
などとするんですね.

課題

アナログ時計を作ろう. 世の中のアナログ時計って, 日時の表示があったり, 文字盤に絵が描いてあったり, 月齢計があったり, n時0分には楽隊が出てきて演奏したりするよね :)

デジタル時計の例

クラス Calendar の API は, CLDC のドキュメントの中にあります.