InvertFuncで直接循環周期列を生成

InvertFuncの中で直接循環周期列を生成するという方式変更がまだ収束していない.⇒ようやく整理が付いたが,まだ不具合がある.2は通ったが,3で不一致が生じている.1/3=0.3333…だから,固定桁0, 循環桁1でなくてはならないのに,固定1,循環1になっている.⇒調整した.今度は4で0.2という値が出てきた.x=1から始めているので,10÷4=2になってしまう.勘違いしていた.1/4=0.25が正解だ.旧版で0.25は出ているが,訂版でQが足りない.0.20となっている.Qを格納する前に離脱しているためだ.QTはQが確定した時点で書き込みできるので,先行して格納してやればよい.

1/10で停止した.ただし,今回は訂版の方が正しい,旧版が0.0に対し,新版は0.1と正しい答えを返している.旧版にも穴があったということだろうか?7桁になるとさすがに重くなる.点滅も出ない.⇒8桁の12345678までの動作は確認した.旧版でn=10, b=10のとき,誤動作が起きる件に関しては別途しらべておく必要がある.この論理は最終的に破棄されることになるので,やらなくても構わないのだが,一応その原因は突き止めておいた方がよい.

いや,まだ12345678の処理は完了していない.ToBCDの引数のvalが配列サイズ上限の536608768を超えてしまっている.処理ではオーバーフローした分は切り捨てるようになっているようだが,最後まで実行できるだろうか?この小数は固定桁1,循環桁335616なので,改訂版なら問題なく処理できる範囲だが…⇒まだまだ掛かりそうなので一端打ち切ることにしよう.n=10, b=10の場合,ConvertNum2Stringをnn=1, b=10で呼び出して,nnstrに値が入ってこない.

ConvertNum2Stringから呼び出しているToBCDでは,val≦1では無動作で抜けている.ToBCDではvalをbで割る計算をしているので,n=1ないし,b=1では停止しないためではないか?いや,ここではこれらの値を除外する理由はないように思われる.いや,少なくともb=1ではこの論理では無限ループになってしまう.⇒b=1では抜けるようにした.これで正しく動作するようになった.

n=1, b=2でInvertを実行したら,inverseの値が消えたままになる.リターンキーで更新を実行しても埋まらない.なぜだろう?この値はTextBox5として表示されている.DispInvertでは暫定措置として,n=1の場合はTextBox5を空として離脱している.これは,n=1の場合のテキストが無闇に長くなることを回避するための措置と考えられるが,nnstr = “/” + basestr + “:1.0&/”をそのまま表示でよいのではないか?⇒大体これで収まったのではないか?いや,まだ数値が合っていない.

両方間違っている.n=123ではn=123 b=10 fixed=1 k=5 keta=6としているが,実際はfixed=0 k=6でなくてはならない.実際1/123=0.00813008130081300813008130081301で循環部は,0081300813だ.InvertFuncにまだ不良が残っている.⇒fixed = IT(j) – 1のように調整してみたが,却って悪い.たとえば,n=12の場合,1/12=0.083333だが,固定桁1, 循環1で/A:0.0&8/のようになってしまう.RT(0)を格納して,i=1の場合はfixed=0となるように調整した.

n=10, b=10の場合,fixed=0, k=0になってしまう.1/10=0.1だから,固定1でなくてはならないのだが… ダメだ.まだ合わない.n=6, b=10でfixed=0 K=1になってしまう.1/6=0.1666 でfixed=1,k=1でなくてはならない.InvertFuncの論理では,Q=x*b\n…Rを計算している.初回は1*10\6=1でR=4となる.次回は4*10\6で6…4.ここでR(0)=10%6=4なので,fx=0,k=1となってしまう.

大体合うようになったが,3の場合,fx=1, k=1 になってしまう.1/3=0.333なのでfx=0, k=1でなくてはならない.結局,3と6の切り分けがつかない状態になっている.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA