!記数法の変換(10進法からN進法へ)
LET MaxLevel=200 !最大桁数
DIM b(MaxLevel) !循環節の候補
FUNCTION DigitFromAscii$(x) !N進法の数字記号 ※ASCIIコード表から IF x>9 THEN LET DigitFromAscii$=CHR$(x-10+ORD("A")) !ABCD…XYZ ※N88系はASC("A") ELSE LET DigitFromAscii$=CHR$(x+ORD("0")) !0123…789 ※STR$(x)でも可 END IF END FUNCTION
FUNCTION ExBSTR$(a,N) !非負の数aをn進法表記の文字列 !整数部 LET aa=INT(a) !小数部を削除する LET b$="" !変換後の数 DO WHILE aa>=N LET b$=DigitFromAscii$(MOD(aa,N))&b$ !a=b[k]*N^k+b[k-1]*N^(k-1)+ … +b[1]*N^1+b[0]*N^0より LET aa=INT(aa/N) !次の桁へ ※右シフト LOOP LET b$=DigitFromAscii$(aa)&b$ !小数部 LET aa=a-INT(a) !整数部を削除する LET k=1 !小数桁 DO UNTIL aa=0 !小数第1位から順に IF k=1 THEN !初回のみ LET b$=b$&"." !小数点をつける LET p=POS(b$,".") ELSE FOR i=1 TO k-1 !循環したか確認する IF b(i)=aa THEN LET b$(i+p:i+p)="["&b$(i+p:i+p) !循環節 LET b$=b$&"]" EXIT DO END IF NEXT i END IF LET b(k)=aa LET aa=aa*N !左シフト LET b$=b$&DigitFromAscii$(INT(aa)) !a=b[-1]*N^(-1)+b[-2]*N^(-2)+ … +b[-(k-1)]*N^(-(k-1))+b[-k]*N^(-k)より LET aa=aa-INT(aa) !整数部分を削除して、次の桁へ LET k=k+1 IF k>MaxLevel THEN !循環小数によるループを回避する PRINT "打ち切りました。" EXIT DO END IF LOOP LET ExBSTR$=b$&"("&STR$(N)&")" !….…(N)形式 END FUNCTION
PRINT ExBSTR$(0.1,2) PRINT ExBSTR$(.6875,5) PRINT ExBSTR$(100.75,16) PRINT ExBSTR$(123,8) PRINT ExBSTR$(123.,10)
END
|