eraシリーズ改造/バリアント開発の覚え書き

LOG10を利用した数字の桁分割


Emueraスレでは「意味不明な命令」扱いされているLOGなどの数学関数は、実際にはとても頼れる関数だったりする。
実は頼れる数学関数その1「LOG10」編と題して書いてみる。

12500という数値を一二五〇〇として表示したい、という場合に、どういう処理をすればよいか。いろんなやり方が思いついたと思うが、こういうときにLOG10が便利。以下のように書ける。

CALL NUMTOKANJI, 12500
PRINTFORM %RESULTS%

@NUMTOKANJI, ARG
#DIMS NUMS, 10
SPLIT "〇;一;二;三;四;五;六;七;八;九", ";", NUMS
VARSET LOCALS
LOCAL = LOG10(ARG)+1
REPEAT LOCAL ; 桁数の分ループ
    LOCAL:1 = ARG % POWER(10, LOCAL - COUNT) / POWER(10,  LOCAL - COUNT - 1)
    LOCALS = %LOCALS%%NUMS:(LOCAL:1)%
REND
RESULTS = %LOCALS%

桁数を取ってきて、桁数分処理を繰り返す、というわけだ。10のn乗で割った余りを10の(n-1)乗で割ればn桁目の数を取り出せる。例えば512の百の位を求めるなら1000で割った余りを100で割れば5が出てくる。10のn乗の数はPOWER(10, n)で取得できるから、それを使えばいい。問題は桁数の取得の方だ。
数字の桁は目で見れば一発で分かるものだが、実際に計算しようとすると非常に悩ましい。
ループしながら10で割り続けてその回数を調べるとか、文字列に変換して文字数を取得するとか、やり方はいろいろあるのだが、そういう数字絡みのことは数学関数でどうにかなることが多い。数学関数を使うのが一番シンプルで一番速い。シンプルなので改修や拡張もしやすい。
もっとも、単純に区切り文字を入れたいだけだったりすると素直にTOSTRの第二引数を使ってしまうのがよい。そのあたりはうまく使い分けるといいだろう。

LOG10のことをちょっと説明しておく。
LOG10関数は「10を底とする数値の常用対数を返す」ものなのだが、「10を底とすると数値の常用対数」と言われても、数学に疎い人にはなんのことだか分からないことと思う。筆者もよく分からん。分からないなりに考えて、「10のn乗に対する数の大きさのレベルみたいなもの」だと思うことにした。
たとえば二桁の整数をLOG10すると1以上2未満の値が取れる。三桁なら2以上3未満、四桁なら3以上4未満、という具合に、n桁(つまり10の(n-1)乗以上10のn乗未満の数)ならn-1以上n未満の値、ということになる。10の2乗ならレベル1、10の10乗ならレベル9、みたいな感じで、10のn乗という物差しで計ったときの数の大きさの度数を「10を底とすると数値の常用対数」と呼ぶ……んじゃないかな、たぶん。

なお、Emueraでは基本的に整数値しか取り扱うことができないので、LOG10関数にn桁の数を引数に渡すと、小数が切り捨てられてn-1が返ってくる。ふつうは小数点以下もちゃんと数が続くので、あしからず。もっとも今回のように桁数を調べたいときはどうせ小数は切り捨ててしまうのだが。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

リンク

漠々ト、獏
eramaker/eramaker2の開発元の公式サイト。

Emuera - emurator of eramaker
C#で書かれたeramakerのエミュレータ「Emuera」のプロジェクトページ。

eraシリーズを語るスレ まとめ
eraシリーズ全般のまとめ。バリアント情報、改造情報など。

eratoho まとめ
eramakerのバリアント「eratoho」のまとめ。

era板
eraシリーズについての掲示板。

サブページ

Rubiera
Bitbucket上のRubieraプロジェクトページ。Rubieraのソースコードのダウンロードはここで。

管理人/副管理人のみ編集できます