プレイ日記
HMF gunsofthemy
たまたま見つけたバグ(?)です。某番組の説を検証しようとしたところ、何故か一桁目が0になりました。(1×1なので一桁目は絶対に1) ・・・こんなん多分知ってるだろ
12そうだね
プレイ済み
返信[1]
親投稿
実数型で大きすぎる数を表現しようとすると正確に表せないことがあるんですよね。(詳しくは知らない)
2そうだね
プレイ済み
返信[2]
親投稿
コウラン coulank
たぶん有効数字の問題かと思います…! 普段プチコンで使われる数は倍精度実数型というので、整数のみなら16桁の9千兆くらいまでは表示できるみたいです! それを超えたら処理の都合上、前後の偶数のあやふやな結果が表示されます、今回は17桁目が1なので、0になっただけなのです!
2そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
これはバグではなく仕様です。 プチコン3号の実数型は一般的には倍精度浮動小数点型と言われているものでこれは64bit(2進数で64桁)で値を表現しています。64bitのうち符号が1bit、指数が11bitであるため仮数部は52bitとなります。 つまり、有効桁数は2進数で52桁分となり、これは10進数だと約16桁となります。要するにプチコン3号の実数型は最大でも16桁分の精度しかないため大きな数を計算してそれ以上の桁数になった場合には下の桁が0で埋められるわけです。POW(2,100)とか計算してみると分かると思います。
4そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
整数ではコウランさんも書かれているように9007199254740992までならば正しく表示が可能ですが、小数においては注意すべき点が2つあります。 1つは有効桁数による丸め誤差です。内部では2進数で記録されているため0.1のような数値も循環小数になってしまい誤差が発生します。(詳しくは下記リンク参照) https://miiverse.nintendo.net/posts/AYIHAAAEAAASVZKdAWi67g もう1つは小数を表示する場合は小数第9位以下は表示がされないことです。(0.000000004は0と表示される) これを回避するにはFORMAT$を使うか、私の自作関数PSTR$を使うしかありません。
4そうだね
プレイ済み
返信[5]
親投稿
みなつ tksm372
みなさん、返事はやっ(゜◇゜) 例題を計算したので、せっかくなので画面だけでも。。。
2そうだね
プレイ済み
返信[6]
親投稿
HMF gunsofthemy
なるほど、仕様なんですか… 因みにコレを正しく計算させるにはどうしたらいいんでしょうか? 有効数字とかなんちゃら整数型とかの知らない単語が並びすぎてちょっとフリーズしてるんで教えてください。(まぁ未来永劫使わないとは思いますが)
1そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
実数型の有効桁数を超えるような値を正しく計算するには多倍長演算プログラムを作れば良いです。様々なアルゴリズムがあります(詳しくはネット検索してください)が、全桁を配列に入れてそれを筆算で解くような感じで計算するのが簡単ではないかと思います。
4そうだね
プレイ済み
返信[8]
親投稿
ツララ LongIceSword
全部の桁の数を配列に入れる処理って S=数値 N=FLOOR(LOG(S,10))+1 DIM AR[N] FOR I=0 TO N-1 AR[I]=S MOD 10 S=(S-AR[I])/10 NEXT みたいな感じですかね。 高度サウンドユニットを購入してる人なら ARYOP命令とRINGCOPY命令を使って高速な演算処理を作れそう。
2そうだね
プレイ済み
返信[9]
親投稿
SilverBlue Corei72630QM
コマさん(NNID;ko.ro.55-ma2)が、桁数に制限の無い電卓を公開しています。これならいけると思います。 公開キー;D2EB46D
1そうだね
プレイ済み
返信[10]
親投稿
ツララ LongIceSword
>SilverBlueさん アルゴリズムの内容について考える面白そうなネタがそこにあるのに自分では何も手をつけようとはしないんです? というか他の人に パ ス を 出 し て る の分かりませんか? せっかくおちゃめさんやみなつさんが興味を持ったネタなのに面白く転がりそうとは思わないんです?
0そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
ツララさんへ 基本的にその方法で問題はありません。 しかし、LOGを使った桁数判別はLOGの演算精度が問題になる場面もあるということも知っておくと良いかもしれません。 例えばFLOOR(LOG(1000,10))を計算してみると本来は3であるはずなのに2になっていることが分かります。 他にも1000000、1000000000、1000000000000、1000000000000000、1000000000000001、1000000000000002などで誤動作してしまうため例外処理を行う必要があります。 それが面倒ならばLOGを使わない桁数判別を行うと良いでしょう。
0そうだね
プレイ済み