疑問 やと 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 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 " ";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 |