プログラミング言語レベルでも浮動小数をサポートしない環境で小数を使いたい場合は、ソフトウェア的になんとかすることになります。
緯度経度精度を文字列化するGeo3x3のIchigoJam BASICの実装はまさにそれ。配列を使って多桁演算を実装し、エンコードとデコードを実装しました。(参考、50言語目のGeo3x3実装はIchigoJam BASIC! 固定小数計算ライブラリと伝説の言語COBOL)
この実装を元に浮動小数を使わないGeo3x3を構造化プログラミング言語「Wirth」へ移植しました。
手続き型言語 IchigoJam BASIC での多桁演算の引き算
150 @SUB:FORI=N-1TO0STEP-1:IF[A+I]<[B+I]&&I>0[A+I-1]=[A+I-1]-1:[A+I]=[A+I]+10 170 [C+I]=[A+I]-[B+I]:NEXT:RTN
これを Wirth で記述します
function sub(a, b, c) n <- a.length for i <- n - 1 to 0 step -1 if a[i] < b[i] and i > 0 a[i - 1] <- a[i - 1] - 1 a[i] <- a[i] + 10 endif c[i] = a[i] - b[i] next end
記述量は長くなりますが、構造化され見通しは良いですね。
これが構造化プログラミング言語の良いところ!
「Geo3x3_encode without float - Wirth Playground」
緯度(lat)経度(lng)精度(level)から、Geo3x3文字列を生成します。
「Geo3x3_decode without float - Wirth Playground」
Geo3x3文字列から緯度経度精度に変換します。
使うほどに改良が進む、プログラミング言語開発。変数の表示を改良して読みやすくなり、文字列の長さに対応、値を返さないreturnができないバグを修正しました。
- Geo3x3
- 教育用手続き型プログラミング言語 - IchigoJam BASIC
- 教育用構造化プログラミング言語 - Wirth(ヴィルト)