組み込み関数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
|