LoginSignup
3
1

Mind8で通貨型(64bit整数の4桁スケーリング固定小数点型)の四則演算を実装してみる(currency.src)

Last updated at Posted at 2024-04-02

はじめに

諸般の流れから日本語プログラミング言語Mindで固定小数点計算機能を書いてみようかなと思い立ち、Mind開発者の@killyさんのご支援をいただきつつMind8のkernelの修正実行に挑戦中の続きです。

前回で倍精度整数(64bit整数)の四則演算処理のオーバーフローチェックをとりあえず実装しました。今回はついに本題の通貨型の四則演算を実装してみます。

通貨型変数とは

通貨型変数とは符号付き64bit整数(-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807)として格納され、小数点の左側に 15 桁、右側に 4 桁の固定小数点を指定するために 10,000 でスケーリングされて入出力します。
見かけ上は、-922,337,203,685,477.5808 から 922,337,203,685,477.5807 の範囲が扱えることになります。

この範囲の小数がそれぞれ10,000倍された状態の整数として演算されます。足し算、引き算は通常の符号付き64bit整数と変わりなく、書式表示として小数点表示されるだけです。

掛け算の場合は10,000倍余分に掛けられた結果となりますので、通常の符号付き64bit整数の掛け算の結果を10,000で割ります。(これはあくまで内部の状態ですので表示される場合はさらに10,000で割られたかのように小数点表示されます。実際には割らず小数点付与での文字列処理で書式表示します。)

割り算の場合は10,000倍余分に割られた結果となりますので、通常の符号付き64bit整数の割り算の結果を10,000で掛けます。(これであくまで内部の状態では固定小数の10,000倍された整数となっていますので、表示される場合はこの状態を10,000で割られたかのようにして小数点表示します。掛け算と同様、実際には文字列処理です。)

前提条件

Windows11 Pro 22H2
VSCode(Visual Studo Code) 1.86.1
Microsoft Visual C++ 2008 Express Edition
Mind Version 7.5 for Windows
Mind Version 8.07 for Windows

MindはMind8のバージョンのパスが構成されていることを前提とします。もしも本記事の内容をお試ししたい場合は辞書修正ツールでMind7のライセンスが必要となりますのでご注意ください。今回はMind8側だけの実装となります。

VSCodeの拡張機能

C/C++ for Visual Studio Code 1.18.5 Microsoft
C/C++ Extension Pack 1.3.0 Microsoft

C/C++のデバッガはMind8のCカーネルアプリケーションをデバッグ実行するために使用しています。今回はMind側だけの実装となります。

お題のソースコード Mind

とりあえず今回はメイン付きのアプリケーションとして実装ています。

currency.src
通貨変数は 倍精度変数と 等価。
c加えは q加えと 等価。
c引くは q引くと 等価。
通貨型スケーリングは 文字列定数 "10000"。

c文字列初期化とは
        初期化文字列は 文字列
        整数部文字列は 文字列
        小数部文字列は 文字列

    初期化文字列に 入れ
    初期化文字列から 4文字だけ 右側取り出し 小数部文字列に 入れ
    初期化文字列から 初期化文字列の 文字数から 5文字 引いて 取り出し 整数部文字列に 入れ
    整数部文字列と 小数部文字列を 合成し
    q文字列初期化し
    。

c掛けとは
        scaleは 倍精度変数
    通貨型スケーリングを q文字列初期化し scaleに 入れ
    q掛け scaleを q割り
    。

c割りは 
        scaleは 倍精度変数
    通貨型スケーリングを q文字列初期化し scaleに 入れ
    q割り scaleを q掛け
    。
    
c数値表示とは
        long1は 倍精度変数
        long2は 倍精度変数
        scaleは 倍精度変数
    long1に 入れ
    通貨型スケーリングを q文字列初期化し scaleに 入れ
    long1と scaleの q余り long2に 入れ
    long1と scaleを q割り
    $$倍精度表示し "."を 表示し 
    long2が 0に 等しい
    ならば "0000"を 表示し
    さもなければ long2を   数値表示し
    つぎに
    。

メインとは
        curr1は 通貨変数
        curr2は 通貨変数
    "250.0000"で c文字列初期化し curr1に 入れ
    "2.0000"で c文字列初期化し curr2に 入れ
    curr1を c数値表示し 改行し
    curr2を c数値表示し 改行し
    curr1と curr2を c加え c数値表示し 改行し
    curr1と curr2を c引き c数値表示し 改行し
    curr1と curr2を c割り c数値表示し 改行し
    curr1と curr2を c掛け c数値表示し 改行し
    。

初期化処理は小数点位置4桁後0埋め必須の手抜き実装です。数値表示処理も小数点位置4桁後0埋めの固定書式です。

実行結果

コンパイルは前回記事の倍精度変数四則演算のオーバフローチェック付き版のfileライブラリでビルドします。

PS C:\developments\vscode\mind8\bin> mind ..\sample\currency ..\lib\file
   
日本語プログラミング言語 Mind Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> ..\sample\currency.exe
PS C:\developments\vscode\mind8\bin> ..\sample\currency
250.0000
2.0000
252.0000
248.0000
125.0000
500.0000

いちおう想定値どおりです。:tada::tada::tada::tada:

おわりに

いくつかの課題を棚上げしつつ、とりあえずこぎつけました:tada:2か月前はどうなるかまったく見通せませんでした、亀進行で課題を小さくして細かくクリアしながらなんとかここまできました。@killyさんにスペシャルサンクスです。あらためてお礼申し上げます。

2024/04/04 訂正

割り算の実装を訂正しました。よく考えれば掛け算の逆ですね。ちょっとタイムアウト気にしすぎて見過ごしてしまいました。

2024/04/06 追記

割り算のロジックの説明を追記しました。

3
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1