2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語Mind8で多倍長十進数計算

Last updated at Posted at 2024-05-20

基本演算は、ほぼ出来ました。

事務処理用には、指定桁での切り捨て、切り上げ、四捨五入などを実装します。
科学技術計算用には、初等関数を実装できればと考えています。

メインソースは下記のとおりです。
サブプログラムの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
2
0
0

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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?