新しく発言する  EXIT  インデックスへ

組み込み関数BSTR$を拡張する


  組み込み関数BSTR$を拡張する 山中和義 2008/03/29 19:40:53 
組み込み関数BSTR$を拡張する  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/03/29 19:40:53

!記数法の変換(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
  組み込み関数BVALを拡張する 山中和義 2008/03/29 19:41:48 

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。