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

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


  組み込み関数BSTR$を拡張する 山中和義 2008/03/29 19:40:53 
  組み込み関数BVALを拡張する 山中和義 2008/03/29 19:41:48 

  組み込み関数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   ツリーへ
Re: 組み込み関数BSTR$を拡張する  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/03/29 19:41:48
組み込み関数BVALを拡張する


!記数法の変換(N進法から10進法へ)

LET MaxLevel=200 !最大桁数

FUNCTION VAL1(x$,N) !N進法の数値 ※ASCIIコード表から
IF t$>"9" THEN
LET t=ORD(t$)-ORD("A")+10
ELSE
LET t=ORD(t$)-ORD("0") !※t=VAL(t$)でも可
END IF
IF t<0 OR t>=N THEN !0〜N-1の範囲かどうか確認する
PRINT x$;"は範囲外の値です。"
STOP
END IF
LET VAL1=t
END FUNCTION

FUNCTION ExBVAL(a$,N) !a$を非負のn進法の数とした値
LET L=LEN(a$) !文字列長を得る

!整数部
LET s=0
FOR i=1 TO L !上位の桁から順に
LET t$=UCASE$(a$(i:i))
IF t$="." THEN EXIT FOR !小数点なら、終了

LET s=s*N+VAL1(t$,N) !多項式(( … ((a[1]*N+a[2])*N+a[3])*N … +a[i-2])*N+a[i-1])*N+a[i] ※左シフト
NEXT i


!小数部
LET ss=0
IF i<L THEN
LET i=L !下位の桁から順に ※精度の確保
LET k=0 !桁数
DO
LET t$=UCASE$(a$(i:i))
IF t$="." THEN EXIT DO !小数点なら、終了

IF t$="]" THEN !循環小数なら
LET p=i !位置を記録する
ELSEIF t$="[" THEN
IF k<MaxLevel THEN LET i=p !有効桁数だけ繰り返す
ELSE
LET ss=ss/N+VAL1(t$,N) !多項式(( … ((a[i]/N+a[i-1])/N+a[i-2])/N … +a[3])/N+a[2])/N+a[1] ※右シフト
END IF

LET i=i-1 !次の桁へ
LET k=k+1
LOOP
LET ss=ss/N
END IF

LET ExBVAL=s+ss
END FUNCTION



PRINT ExBVAL("0.199999999999",16)
PRINT ExBVAL("1.1[9]",16) !循環小数 1.1999…
PRINT ExBVAL(".[3204]",5) !0.320432043204…
PRINT ExBVAL("123",8)
PRINT ExBVAL("123.",10)


END

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