基本演算は、ほぼ出来ました。
事務処理用には、指定桁での切り捨て、切り上げ、四捨五入などを実装します。
科学技術計算用には、初等関数を実装できればと考えています。
メインソースは下記のとおりです。
サブプログラムのlnumsub01,lnumsub02は、mind会議室のライブラリをご覧ください。
※タイトル 多倍長整数や小数をmind独自で定義し計算する。
※ 各計算結果は、 即座にL小数型に格納してください。
※
"lnumsub01"を コンパイルする。
"lnumsub02"を コンパイルする。
グローバル。
L小数型は 文字列実体と 等価。
L小数情報は 文字列情報と 等価。
L小数?とは (文字列 → 合否)
文字列Aは 文字列
文字Aは ワード変数
文字数Aは ワード変数
小数点有は ワード変数
文字列Aに 入れる
小数点有を クリアし
文字列Aの 左端文字が '-'と 等しい
または
文字列Aの 左端文字が '-'と 等しい
または
文字列Aの 左端文字が '+'と 等しい
または
文字列Aの 左端文字が '+'と 等しい
ならば 文字列Aから 一文字切り出し 捨てる
つぎに
文字列Aの 文字数を 文字数Aに 入れる
文字数Aが 0と 等しい
ならば 0を 返し 終わり
つぎに
※左端の±記号を除いたあと、左右端も文字は数字(小数点は中間にしかない)
文字列Aの 左端文字を 一文字数値変換し
偽? ならば 捨て 0を 返し 終わり
つぎに
文字列Aの 右端文字を 一文字数値変換し
偽? ならば 捨て 0を 返し 終わり
つぎに
文字数A 回数指定し
文字列Aから 一文字右側切り出し 文字Aに 入れる
文字Aが '.'と 等しい
ならば 小数点有 ならば ※ 小数点'.'が2個以上あるとエラー
0を 返し 終わり
さもなければ
小数点有を セットし
つぎに
さもなければ
文字Aを 一文字数値変換し
偽? ならば 捨て 0を 返し 終わり
つぎに
つぎに
繰り返す
1を 返す。
L大小とは (L小数、L小数 → -1/0/1)
符号Cは 変数
符号Dは 変数
絶対値大小は 変数
K小数に変換し 小数Dに 入れる
K小数に変換し 小数Cに 入れる
小数Cの K符号を 符号Cに 入れる
小数Dの K符号を 符号Dに 入れる
小数Cと 小数Dの K小数絶対値の大小比較を 絶対値大小に 入れる
絶対値大小が 0と 等しい
ならば 符号Cと 符号Dが 等しい
または
小数Cが Kゼロ?
ならば 0を 返す 終わり
つぎに
つぎに
絶対値大小が -1と 等しい
ならば 符号Dに -1を 掛け 返す
さもなければ
符号Cを 返し
つぎに。
L等しいとは (L小数、L小数 → 0/1)
L大小が 0と 等しい。
L異なるとは (L小数、L小数 → 0/1)
L大小が 0と 異なる。
L大きいとは (L小数、L小数 → 0/1)
L大小が 1と 等しいこと。
L小さいとは (L小数、L小数 → 0/1)
L大小が -1と 等しいこと。
L以上とは (L小数、L小数 → 0/1)
L大小が 0 以上であること。
L以下とは (L小数、L小数 → 0/1)
L大小が 0 以下であること。
L大きい方とは
入力小数Aは L小数情報
入力小数Bは L小数情報
入力小数Aと 入力小数Bに 入れる
入力小数Aが 入力小数Bより L以上
ならば 入力小数Aを 返す
さもなければ
入力小数Bを 返す
つぎに。
L小さい方とは
入力小数Aは L小数情報
入力小数Bは L小数情報
入力小数Aと 入力小数Bに 入れる
入力小数Aが 入力小数Bより L以上
ならば 入力小数Bを 返す
さもなければ
入力小数Aを 返す
つぎに。
Lゼロ?とは (L小数 → 0/1)
K小数に変換し Kゼロ?。
Lゼロ以外?とは (L小数 → 0/1)
K小数に変換し Kゼロ以外?。
L正?とは (L小数 → 0/1)
K小数に変換し K正?。
L負?とは (L小数 → 0/1)
K小数に変換し K負?。
L非負?とは (L小数 → 0/1)
K小数に変換し K非負?。
L加えとは (L小数、L小数 → L小数)
K小数に変換し 小数Dに 入れる
K小数に変換し 小数Cに 入れる
小数Cと 小数Dの K小数の加算結果を K小数を文字列変換し 返す。
L引きとは (L小数、L小数 → L小数)
K小数に変換し 小数Dに 入れる
K小数に変換し 小数Cに 入れる
小数Cと 小数Dの K小数の減算結果を K小数を文字列変換し 返す。
L掛けとは (L小数、L小数 → L小数)
K小数に変換し 小数Dに 入れる
K小数に変換し 小数Cに 入れる
小数Cと 小数Dの K小数の掛け算結果を K小数を文字列変換し 返す。
L負数とは
K小数に変換し K負数を K小数を文字列変換し 返す。
L絶対値とは
K小数に変換し K絶対値を K小数を文字列変換し 返す。
L整数を掛けとは
入力小数は L小数情報
乗数は 変数
入力小数と 乗数に 入れる
入力小数を K小数に変換し 小数Cに 入れる
小数Cの 乗数の K整数と整数の掛け算結果を K小数を文字列変換し 返す。
Lべき乗とは (L小数、L小数 → L小数)
入力小数は L小数情報
累乗数は 変数
入力小数と 累乗数に 入れる
入力小数を K小数に変換し 小数Cに 入れる
小数Cの 累乗数の K小数の自然数乗を K小数を文字列変換し 返す。
L平方根精度指定とは (L小数、精度 → L小数)
入力小数は L小数情報
精度は 変数
入力小数と 精度に 入れる
入力小数を K小数に変換し 小数Cに 入れる
小数Cの 精度に K小数の平方根精度指定を K小数を文字列変換し 返す。
L整数の商と余りとは (L整数、L整数 → L商、L余)
入力分子は L小数情報
入力分母は L小数情報
K商情報は 構造体情報
K余情報は 構造体情報
出力商は L小数型 長さ 最大文字数
出力余は L小数型 長さ 最大文字数
入力分子と 入力分母に 入れる
入力分子を K小数に変換し 小数Cに 入れる
入力分母を K小数に変換し 小数Dに 入れる
小数Cの K小数桁数が 0より 大きい
または
小数Dの K小数桁数が 0より 大きい
ならば 改行し 「<L整数の商と余りに小数はダメです!>」と 表示し
1を 0で 割る
つぎに
小数Cと 小数Dの K商と余りを K商情報と K余情報に 入れる
K商情報を K小数を文字列変換し 出力商に 入れる
K余情報を K小数を文字列変換し 出力余に 入れる
出力商と 出力余を 返す。
L商_桁未満切り捨てとは (L小数、L小数、小数桁数 → L小数 )
0の L商を 返す。
L商_桁未満四捨五入とは (L小数、L小数、小数桁数 → L小数 )
1の L商を 返す。
L商_桁未満切り上げとは (L小数、L小数、小数桁数 → L小数 )
2の L商を 返す。
Lカンマ区切付加とは
文字列Aは 文字列
文字列Bは 文字列実体
小数点位置は ワード変数
整数部桁数は ワード変数
三での商は ワード変数
三での余は ワード変数
文字列Aに 入れる
文字列Bを クリアする
文字列Aの 左端文字が '-'と 等しい
または
文字列Aの 左端文字が '+'と 等しい
ならば 文字列Aから 一文字切り出し 文字列Bに 一文字追加する
つぎに
文字列Aの '.'を 一文字検索し 小数点位置に 入れる
小数点位置が 1 以上
ならば 小数点位置から 一つ引いて 整数部桁数に 入れる
さもなければ
文字列Aの 文字数を 整数部桁数に 入れる
つぎに
整数部桁数を 3での 商と余りを 三での商と 三での余に 入れる
三での余が 0と 等しい
ならば 3文字だけ 文字列Aから 切り出し 文字列Bに 追加する
三での商を 一つ減少する
さもなければ
三での余だけ 文字列Aから 切り出し 文字列Bに 追加する
つぎに
三での商 回数指定し
','を 文字列Bに 一文字追加し
3文字だけ 文字列Aから 切り出し 文字列Bに 追加する
繰り返す
文字列Aを 文字列Bに 追加する
文字列Bを 返す。
Lカンマ区切表示とは
Lカンマ区切付加し 表示する。
L小数型は 文字列実体
L小数型は、内部では、符号、桁数、小数桁数、各桁の数字からなる構造体を使っていますが、ユーザインターフェースは、文字列実体”+123.456”などを使っていますので、mindに元からある整数や小数などとの型変換は、「数値変換」「文字列変換」などを使えば可能だと思います。
事務処理用であれば、そんなに長い桁数は必要ないと思います。
内部の小数型定義
最大桁数は 定数 500。
最大文字数は 定数 最大桁数に 2 加えたもの。
ローカル。
K小数型は 型紙
K符号は 変数
K桁数は 変数
K小数桁数は 変数
K数字は バイト変数
全体は K符号と K桁数と K小数桁数と 最大桁数の K数字。
各計算結果は、 即座にL小数型への格納が必要
各演算の作業用に同一の文字列実体を使っているので、例えば下記の2つめはうまく動作しません。
メインは ( ・ --> ・ )
"100"に "200"を L加え 表示する 改行する
"100"に "200"を L加え "500"を L加え 表示する 改行する。
実行結果
c:\mind8\pmind\sample>test03
+300
+0500