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

# はじめに

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

[前回](https://qiita.com/mylifewithviolin/items/a9cd528ce1031a28f13c)で倍精度整数（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
とりあえず今回はメイン付きのアプリケーションとして実装ています。

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

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

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

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

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

メインとは
        curr1は　通貨変数
        curr2は　通貨変数
    "250.0000"で　ｃ文字列初期化し　curr1に　入れ
    "2.0000"で　ｃ文字列初期化し　curr2に　入れ
    curr1を　ｃ数値表示し　改行し
    curr2を　ｃ数値表示し　改行し
    curr1と　curr2を　ｃ加え　ｃ数値表示し　改行し
    curr1と　curr2を　ｃ引き　ｃ数値表示し　改行し
    curr1と　curr2を　ｃ割り　ｃ数値表示し　改行し
    curr1と　curr2を　ｃ掛け　ｃ数値表示し　改行し
    。
```
初期化処理は小数点位置4桁後0埋め必須の手抜き実装です。数値表示処理も小数点位置4桁後0埋めの固定書式です。

## 実行結果
コンパイルは前回記事の倍精度変数四則演算のオーバフローチェック付き版のfileライブラリでビルドします。
```
PS C:\developments\vscode\mind8\bin> mind ..\sample\currency ..\lib\file
   
日本語プログラミング言語 Ｍｉｎｄ 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 追記
割り算のロジックの説明を追記しました。