日本語プログラミング言語Mindの小技 「小数」～構造体の多次元配列内の小数変数～

# はじめに
日本語プログラミング言語Mindの小技「小数」について説明したいと思います。

# 対象読者
日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

# この小技に関連するMind言語マニュアル

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
６ 数値演算
└小数演算

>変数への格納および演算すべて６４ビット長の浮動少数形式で行われる。
>
>   　Mindで言うところの '小数' は他のプログラミング言語で '倍精度浮動小数' と呼ばれるもので、型宣言は他の言語の多くの場合'double'と表記されるものに相当する。


７ 文字列操作
└文字・文字列を置換する
　└数値を文字・文字列に変換
　　└同、小数向け

>（小数向け）
>
>構文＝
＜小数値＞を ＜全桁数＞と ＜小数桁数＞で 文字列変換・小数形式 → ＜文字列情報＞
＜小数値＞を ＜全桁数＞と ＜小数桁数＞で 文字列変換・指数形式 → ＜文字列情報＞
>
>　　注：＜全桁数＞ はゼロを指定すると、最小限必要な桁数が適用される
　　注：変換結果を生成する文字列実体変数として暗黙の変数「変換文字列」が使われ、
>
> そこを指す文字列情報がスタックに返される（元文字列は影響を受けない）
　　注：変換結果を生成する文字列実体変数を明示することもできる。上級編で解説する
　上記は小数値を、それに相当する文字列に変換する処理単語である。前者はあえて（多くの場合、見やすくするために）固定小数として変換するもの、後者は元来の浮動小数形式（指数形式）で変換するものである。
　次のプログラム例は小数値 1.23 を、前記した２つの処理単語を使ってそれぞれ画面に表示するものである。



本機能（本記事）は、下記のバージョンに対応しています。Mind８のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。

# 対応バージョン
□Mind７　■Mind８　■Mind９
■Windows版　□Linux版

# 小技の解説
この記事の取り扱う「小数」は、公式マニュアルにも記載されていますが、６４ビットの倍精度浮動小数点変数です。

この記事でのソースコード例は構造体を基底のメンバとした多次元配列の例となります。その中で、小数値を必要とする属性に「小数変数」を設定し、表示する際には「文字列変換・小数形式」の方を使用し、全桁数には０を指定しています。

構造体の多次元配列については、こちらの記事で解説しています。本記事のソースコードはこちらの記事で使った宇宙構造体の改定版となります。

https://qiita.com/mylifewithviolin/items/05bd513cee3be9a5a6f0

# Mindプログラムソース

```mind:galaxy2.src
宇宙は　構造体
    銀河フィラメント数は　変数
    銀河フィラメント名は　文字列実体　長さ　５０桁
        超銀河団数は　変数
        超銀河団名は　文字列実体　長さ　２０桁
            銀河団数は　変数
            銀河団名は　文字列実体　長さ　２０桁
                銀河数は　変数
                銀河名は　文字列実体　長さ　２０桁
                    恒星数は　変数
                    恒星名は　文字列実体　長さ　５０桁
                        惑星数は　変数
                        惑星名は　文字列実体　長さ　５０桁
                            直径は　　小数変数
                            衛星数は　変数
                            平均公転半径は　小数変数
                        惑星データは　
                                惑星名と　直径と　衛星数と　平均公転半径
                    恒星系は　
                        恒星名と　惑星数と　８個の　惑星データ
                銀河系は　
                    銀河名と　恒星数と　２個の　恒星系   　
            銀河団は　
                銀河団名と　銀河数と　２個の　銀河系
        超銀河団は
            超銀河団名と　銀河団数と　２個の　銀河団
    銀河フィラメントは
        銀河フィラメント名と　超銀河団数と　２個の　超銀河団
全体は　銀河フィラメント数と　２個の　銀河フィラメント。

宇宙空間は　文字列定数　「宇宙」。
暗黒物質は　文字列定数　「　」。

宇宙全体を形成するとは　（・　→　・）
        銀河フィラメント数に　２を　入れ、
        銀河フィラメント名（１）に　「ヘルクレス座・かんむり座グレートウォール」を　入れ、
            超銀河団数（１）に　２を　入れ、
            超銀河団名（１，１）に　「ラニアケア超銀河団」を　入れ、
                銀河団数（１，１）に　２を　入れ、
                銀河団名（１，１，１）に　「局所銀河団」を　入れ、
                    銀河数（１，１，１）に　２を　入れ、
                    銀河名（１，１，１，１）に　「天の川銀河」を　入れ、
                        恒星数（１，１，１，１）に　２を　入れ、
                        恒星名（１，１，１，１，１）に　「太陽」を　入れ、
                            惑星数（１，１，１，１，１）に　８を　入れ、
                            惑星名（１，１，１，１，１，１）に　「水星」を　入れ、
                                直径（１，１，１，１，１，１）に　０．４を　入れ、
                                衛星数（１，１，１，１，１，１）に　０を　入れ、
                                平均公転半径（１，１，１，１，１，１）に　０．４を　入れ、
                            惑星名（１，１，１，１，１，２）に　「金星」を　入れ、
                                直径（１，１，１，１，１，２）に　０．９を　入れ、
                                衛星数（１，１，１，１，１，２）に　０を　入れ、
                                平均公転半径（１，１，１，１，１，２）に　０．７を　入れ、
                            惑星名（１，１，１，１，１，３）に　「地球」を　入れ、
                                直径（１，１，１，１，１，３）に　１．０を　入れ、
                                衛星数（１，１，１，１，１，３）に　１を　入れ、
                                平均公転半径（１，１，１，１，１，３）に　１．０を　入れ、
                            惑星名（１，１，１，１，１，４）に　「火星」を　入れ、
                                直径（１，１，１，１，１，４）に　０．５を　入れ、
                                衛星数（１，１，１，１，１，４）に　２を　入れ、
                                平均公転半径（１，１，１，１，１，４）に　１．５を　入れ、
                            惑星名（１，１，１，１，１，５）に　「木星」を　入れ、
                                直径（１，１，１，１，１，５）に　１１．０を　入れ、
                                衛星数（１，１，１，１，１，５）に　９７を　入れ、
                                平均公転半径（１，１，１，１，１，５）に　５．２を　入れ、                                
                            惑星名（１，１，１，１，１，６）に　「土星」を　入れ、
                                直径（１，１，１，１，１，６）に　９．５を　入れ、
                                衛星数（１，１，１，１，１，６）に　２７４を　入れ、
                                平均公転半径（１，１，１，１，１，６）に　９．６を　入れ、
                            惑星名（１，１，１，１，１，７）に　「天王星」を　入れ、
                                直径（１，１，１，１，１，７）に　４．０を　入れ、
                                衛星数（１，１，１，１，１，７）に　１４を　入れ、
                                平均公転半径（１，１，１，１，１，７）に　１９．２を　入れ、                                
                            惑星名（１，１，１，１，１，８）に　「海王星」を　入れ、
                                直径（１，１，１，１，１，８）に　３．９を　入れ、
                                衛星数（１，１，１，１，１，８）に　２７を　入れ、
                                平均公転半径（１，１，１，１，１，８）に　３０．０を　入れ、
                        恒星名（１，１，１，１，２）に　「プロキシマ・ケンタウリ」を　入れ、
                            惑星数（１，１，１，１，２）に　２を　入れ、
                            惑星名（１，１，１，１，２，１）に　「プロキシマ・ケンタウリｂ」を　入れ、
                                直径（１，１，１，１，２，１）に　１．１を　入れ、
                            惑星名（１，１，１，１，２，２）に　「プロキシマ・ケンタウリｄ」を　入れ、
                                直径（１，１，１，１，２，２）に　０．３を　入れ、
                    銀河名（１，１，１，２）に　「アンドロメダ銀河」を　入れ、
                        恒星数（１，１，１，２）に　２０を　入れ、
                銀河団名（１，１，２）に　「うみへび座銀河団」を　入れ、
                    銀河数（１，１，２）に　２を　入れ、
                    銀河名（１，１，２，１）に　「ＮＧＣ３３０９」を　入れ、
                        恒星数（１，１，２，１）に　２００を　入れ、
                    銀河名（１，１，２，２）に　「ＮＧＣ３３１２」を　入れ、
                        恒星数（１，１，２，２）に　２０００を　入れ、
            超銀河団名（１，２）に　「おとめ座超銀河団」を　入れ、
                銀河団数（１，２）に　１を　入れ、
                銀河団名（１，２，１）に　「おとめ座銀河団」を　入れ、
                    銀河数（１，２，１）に　２を　入れ、
                    銀河名（１，２，１，１）に　「ＮＧＣ４４０８」を　入れ、
                        恒星数（１，２，１，１）に　２００００を　入れ、
                    銀河名（１，２，１，２）に　「ＮＧＣ４４８６」を　入れ、
                        恒星数（１，２，１，２）に　２０００００を　入れ、
        銀河フィラメント名（２）に　「CfA2グレートウォール」を　入れ
            超銀河団数（２）に　２を　入れ、
            超銀河団名（２，１）に　「かみのけ座超銀河団」を　入れ、
                銀河団数（２，１）に　１を　入れ、
                銀河団名（２，１，１）に　「かみのけ座銀河団」を　入れ、
                    銀河数（２，１，１）に　２を　入れ、    
                    銀河名（２，１，１，１）に　「ＮＧＣ４８７４」を　入れ、
                        恒星数（２，１，１，１）に　２００００００を　入れ、
                    銀河名（２，１，１，２）に　「ＮＧＣ４８８９」を　入れ、
                        恒星数（２，１，１，２）に　２０００００００を　入れ、
            超銀河団名（２，２）に　「しし座超銀河団」を　入れ、
                銀河団数（２，２）に　１を　入れ、
                銀河団名（２，２，１）に　「しし座銀河団」を　入れ、
                    銀河数（２，２，１）に　２を　入れ、
                    銀河名（２，２，１，１）に　「ＮＧＣ３６２３」を　入れ、
                        恒星数（２，２，１，１）に　３０００００００を　入れ、
                    銀河名（２，２，１，２）に　「ＮＧＣ３６２７」を　入れ、
                        恒星数（２，２，１，２）に　４０００００００を　入れること。

宇宙を観測するとは    　（・　→　・）
        銀河フィラメント番号は　変数
        超銀河番号は　  変数
        銀河団番号は    変数
        銀河番号は　    変数
        恒星系番号は    変数
        惑星番号は      変数

    宇宙空間を　表示し　暗黒物質を　表示し　
    「銀河フィラメント数：」を　表示し　
    銀河フィラメント数を　数値表示し　改行し、　
    銀河フィラメント番号を　セットし、
    銀河フィラメント数で　回数指定し、
        銀河フィラメント名（銀河フィラメント番号）を　表示し、
        暗黒物質を　表示し　「超銀河団数：」を　表示し　
        超銀河団数（銀河フィラメント番号）を　数値表示し　改行し、
        超銀河番号を　セットし、
        超銀河団数（銀河フィラメント番号）で　回数指定し、
            暗黒物質を　表示し　超銀河団名（銀河フィラメント番号，超銀河番号）を　表示し、
            暗黒物質を　表示し　「銀河団数：」を　表示し　
            銀河団数（銀河フィラメント番号，超銀河番号）を　数値表示し　改行し、
            銀河団番号を　セットし、
            銀河団数（銀河フィラメント番号，超銀河番号）で　回数指定し、
                ２で　回数指定し　暗黒物質を　表示し　繰り返す　
                銀河団名（銀河フィラメント番号，超銀河番号，銀河団番号）を　表示し
                暗黒物質を　表示し　「銀河数：」を　表示し　
                銀河数（銀河フィラメント番号，超銀河番号，銀河団番号）を　数値表示し　改行し、
                銀河番号を　セットし
                銀河数（銀河フィラメント番号，超銀河番号，銀河団番号）で　回数指定し
                    ３で　回数指定し　暗黒物質を　表示し　繰り返す　
                    銀河名（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号）を　表示し、
                    暗黒物質を　表示し　「恒星数：」を　表示し、
                    恒星数（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号）を　数値表示し　改行し、
                    恒星系番号を　セットし、
                    恒星系の　要素数で　回数指定し、
                        恒星名（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号）が　空列に　等しい文字列？
                        でなければ
                            ４で　回数指定し　暗黒物質を　表示し　繰り返す、　
                            恒星名（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号）を　表示し、
                            暗黒物質を　表示し　「惑星数：」を　表示し、
                            惑星数（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号）を　数値表示し　改行し、
                            惑星番号を　セットし、
                            惑星数（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号）で　回数指定し、
                                ５で　回数指定し　暗黒物質を　表示し　繰り返す、　
                                惑星名（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を　表示し、
                                「　直径：」を　表示し、
                                直径（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を
                                ０桁と　１桁で　文字列変換・小数形式し　表示し、
                                「　衛星数：」を　表示し
                                衛星数（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を
                                数値表示し
                                「　平均公転半径：」を　表示し　
                                平均公転半径（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を
                                ０桁と　１桁で　文字列変換・小数形式し　表示し　改行し
                                惑星番号を　一つ増加し
                            繰り返す
                            恒星系番号を　一つ増加し
                        つぎに
                    繰り返す
                    銀河番号を　一つ増加し
                繰り返す
                銀河団番号を　一つ増加し
            繰り返す
            超銀河番号を　一つ増加し
        繰り返す
        銀河フィラメント番号を　一つ増加し
    繰り返す。

メインとは　（・　→　・）
    宇宙全体を形成し
    宇宙を観測すること。
```
本来の単語名の意味からすると要素数のスケールが違い過ぎますが、データの初期化の都合で、極小構成な世界線の異次元ワールドと思っていただければ幸いです:relaxed:

各宇宙構造物の下位レベルの要素数属性を変数で追加しています。
従来は「なになにの　要素数」で回数指定していたのですが、今回は新たに追加した構造物の要素数で回数している点に注目いただければ幸いです。たとえば、太陽系の惑星数は８なので要素数の最大値は８なのですが、プロキシマ・ケンタウリ星系では惑星数２なので、それぞれの恒星系の恒星数を別途宣言しています。

そして、今回のお題は、各惑星の直径の対地球比と、平均公転半径のAU値（これも地球の平均公転半径比が単位となったもの）に「小数変数」を導入しています。

```mind:galaxy2.src
   惑星名は　文字列実体　長さ　５０桁
     直径は　　小数変数
     衛星数は　変数
     平均公転半径は　小数変数
  惑星データは　
     惑星名と　直径と　衛星数と　平均公転半径
```

これらの値を表示する際には、「文字列変換・小数形式」の方を使用し、全桁数には０を指定しています。

```mind:galaxy2.src
  「　直径：」を　表示し、
   直径（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を
   ０桁と　１桁で　文字列変換・小数形式し　表示し、
```

# コンパイル結果
ではコンパイルしてみます。下位ライブラリはfileを指定します。

## Mind９
下図はMind９βです。
```cmd:
C:\developments\vscode\mind9>mind galaxy2 file   

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> galaxy2.exe
```
## Mind8
```cmd:
C:\developments\vscode\mind9>mind galaxy2 file

日本語プログラミング言語 Ｍｉｎｄ Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> galaxy2.exe
```

# 実行結果
つづいて実行してみます。
Mind8の結果です。記述は割愛していますがMind9βも同じです。

```cmd:
c:\developments\vscode\mind9>galaxy2
宇宙　銀河フィラメント数：2
ヘルクレス座・かんむり座グレートウォール　超銀河団数：2
　ラニアケア超銀河団　銀河団数：2
　　局所銀河団　銀河数：2
　　　天の川銀河　恒星数：2
　　　　太陽　惑星数：8
　　　　　水星　直径：0.4　衛星数：0　平均公転半径：0.4
　　　　　金星　直径：0.9　衛星数：0　平均公転半径：0.7
　　　　　地球　直径：1.0　衛星数：1　平均公転半径：1.0
　　　　　火星　直径：0.5　衛星数：2　平均公転半径：1.5
　　　　　木星　直径：11.0　衛星数：97　平均公転半径：5.2
　　　　　土星　直径：9.5　衛星数：274　平均公転半径：9.6
　　　　　天王星　直径：4.0　衛星数：14　平均公転半径：19.2
　　　　　海王星　直径：3.9　衛星数：27　平均公転半径：30.0
　　　　プロキシマ・ケンタウリ　惑星数：2
　　　　　プロキシマ・ケンタウリｂ　直径：1.1　衛星数：0　平均公転半径：0.0
　　　　　プロキシマ・ケンタウリｄ　直径：0.3　衛星数：0　平均公転半径：0.0
　　　アンドロメダ銀河　恒星数：20
　　うみへび座銀河団　銀河数：2
　　　ＮＧＣ３３０９　恒星数：200
　　　ＮＧＣ３３１２　恒星数：2000
　おとめ座超銀河団　銀河団数：1
　　おとめ座銀河団　銀河数：2
　　　ＮＧＣ４４０８　恒星数：20000
　　　ＮＧＣ４４８６　恒星数：200000
CfA2グレートウォール　超銀河団数：2
　かみのけ座超銀河団　銀河団数：1
　　かみのけ座銀河団　銀河数：2
　　　ＮＧＣ４８７４　恒星数：2000000
　　　ＮＧＣ４８８９　恒星数：20000000
　しし座超銀河団　銀河団数：1
　　しし座銀河団　銀河数：2
　　　ＮＧＣ３６２３　恒星数：30000000
　　　ＮＧＣ３６２７　恒星数：40000000

c:\developments\vscode\mind9>
```
アンドロメダ銀河や遠方の銀河団の銀河の恒星数は適当な値です。

# 参考情報
この小技「小数」を使った記述例の記事はまだないようです。見つけたら教えてください。


# おわりに
いかがでしたでしょうか？なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕４０周年です。

## 本記事シリーズのご紹介
本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕４０周年プロジェクト」の一環です。

興味を持たれた方は[日本語プログラミング言語Mind公式サイト](https://www.scripts-lab.co.jp/mind8download/download.html)にアクセスすると、Mindコンパイラをダウンロードできますよ。

[Mindプログラミングマニュアル（基本文法）](https://www.scripts-lab.co.jp/mind/ver8/doc/index.html)ページから気になるお題の構文を選んで、この記事のようにサンプル実装実行してQiitaにアウトプットしてみましょう！

筆者はMind7/8/9βで検証しておりますが、もちろんMind8だけでもじゅうぶんです。またお題が既存記事とかぶるのはまったく問題ありません。同じお題でみなさまの多様斬新なサンプルをお待ちしております:grinning:

面白い！、楽しい、カンタン、難しいのも書ける！みんなでやってみよう:relaxed: