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

  疑問 やと 2006/10/01 14:41:00 
  整数限定ですが, 白石 和夫 2006/10/01 14:52:30 
  10進法の実数をP進法に変換する関数を作り... 荒田浩二 2006/10/05 11:07:08 

  疑問 やと 2006/10/01 14:41:00  ツリーへ

疑問 返事を書く
やと 2006/10/01 14:41:00
数字を2進数の状態で表示することはできるのですか?

  整数限定ですが, 白石 和夫 2006/10/01 14:52:30  ツリーへ

Re: 疑問 返事を書く
白石 和夫 2006/10/01 14:52:30
整数限定ですが,
PRINT BSTR$(12,2)
のようにすれば可能です。

  10進法の実数をP進法に変換する関数を作り... 荒田浩二 2006/10/05 11:07:08  ツリーへ

Re: 疑問 返事を書く
荒田浩二 2006/10/05 11:07:08
10進法の実数をP進法に変換する関数を作りました。
10進法の実数を2進法から9進法までの数値に変換できます。
だいぶ前に作ったものですが外部関数にしてみました。参考にしていただければ。

この関数を使用する際の注意をいくつか。
* P進法への変換は擬似的なもので、プログラムの上ではあくまでも10進法の数値として扱われます。
バイナリ形式による数値表現ではありません。

* 数値モードは1000桁モードをデフォルトとしていますが、他のモードでも実施できます。
ただし精度はかなり低くなります。当然ですが2進法では10進法より桁数が3倍必要です。15桁モードでは精度は期待できません(8進法や9進法への変換なら実用の範囲内かな?)。
精度落ちは1000桁モードでもいえることで、円周率1006桁をこの関数で2進法に変換し別の関数で10進法に戻したところ303桁まで一致しました。

* 1未満の数値を入力すると、指数部のある数値を返すことがあります。
たとえば、2進法に変換して 1.011E-5 という数値が返されたら、これは 1.011*2^(-5)=0.00001011 を意味します。
指数は10進数で表されていますので注意してください。


REM ** 外部関数 CONVERT10toP **
REM ** 10進法で表された実数を、P進法にして返す **

OPTION ARITHMETIC DECIMAL_HIGH !標準モードでも実行できるが低精度
DECLARE EXTERNAL FUNCTION CONVERT10toP

INPUT PROMPT "10進法での数値を入力(0以上) ":k
INPUT PROMPT "何進法に変換するか入力(2以上10未満) ":p
PRINT
IF k<0 OR p<2 OR p>10 OR INT(p)<>p THEN
PRINT "OUT OF RANGE!! STOP!!"
STOP
END IF

LET conp=CONVERT10toP(10,k,p)

! 出力
PRINT "10進法 ";k
PRINT
PRINT " ";STR$(p);"進法 ";conp
LET sconp$=STR$(conp)
LET e=POS(sconp$,"E")
IF e<>0 THEN PRINT "指数部 ";sconp$(e:LEN(sconp$)) ! 指数部のあるとき表示

END


EXTERNAL FUNCTION CONVERT10toP(a,r,p)
OPTION ARITHMETIC DECIMAL_HIGH !標準モードでも実行できるが低精度

! 10進整数をP進整数に変換
LET ir=INT(r) ! rの整数部
LET srp$=""
DO
LET x=MOD(ir,p)
LET srp$=STR$(x)&srp$
LET ir=INT(ir/p)
LOOP UNTIL ir=0
LET irp=VAL(srp$)

! 10進小数をP進小数に変換
LET fr=r-INT(r) ! rの小数部
LET frp=0
LET i=1
DO
LET x=INT(fr/p^(-i))
LET frp=frp+x*a^(-i)
LET fr=fr-x*p^(-i)
LET i=i+1
LOOP UNTIL fr<=EPS(frp) ! EPS関数

LET CONVERT10toP=irp+frp

END FUNCTION



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