プレイ日記
KNTK kotanke3.14
これって(画像) 0.9999999999 を 0.999999……←ずっとつづく って認識されたってこと? (1=0.99999999999…←ずっと続くっていうのは聞いたことがありますが………?)
4そうだね
プレイ済み
返信[1]
親投稿
SquidSky ugomemo_gorohati
ただ、BASICエンジンが2進数で計算しているために、0.9は割り切れないので途中で計算を打ち切り、勝手に四捨五入して数値を丸めているだけです。 これは 仕 様 です。
2そうだね
プレイ済み
返信[2]
親投稿
Hanzo rzsense
残念ながら、違います。 試しに、A=0.99999999(9が8個)を実行したあと、?Aを実行してみましょう。ちゃんと"0.99999999"と表示されるはずです。 ところが、A=0.999999999(9が9個)を実行したあと、?Aを実行したらどうでしょう? "1"が表示されますよね。 コンピューターは、いくらでも小さい数を扱えるわけではなく、扱える数には下限があり、これを下回る数は、コンピューターでは 0 とみなされます。 上記の場合、1-0.999999999=0.000000001 は、小さすぎて扱えず、0とみなされるので、1-0.999999999=0、つまり 1=0.999999999 という奇妙なことになっているわけです。
2そうだね
プレイ済み
返信[3]
親投稿
Hanzo rzsense
何か、:SquidSkyさんの発言に対し「違います」と言ったように見えてしまってますね。恐縮です。 「違います」は、けんたこさんの、0.9999...が、プチコン内で循環小数とみなされているという推定に係っています。
2そうだね
プレイ済み
返信[4]
親投稿
KNTK kotanke3.14
つまり少数第9位以上の桁数だと勝手に変わってしまうのですね! 丁寧に御説明ありがとうこざいます!
0そうだね
プレイ済み
返信[5]
親投稿
MIKI ifconfig
Hanzo さん>1-0.999999999=0.000000001 は、小さすぎて扱えず、0とみなされるので、1-0.999999999=0、つまり 1=0.999999999 という奇妙なことになっているわけです。 有効桁数が違います。 この場合は print 命令が勝手に 0.99..(9桁) を丸めて 1 と表示しているだけです。 正しく表示するためには format$ を使います。 ? format$("%.20f", 0.999999999) 0.9999999990000003000 プチコンで実数型といわれている変数は、一般には「倍精度浮動小数点数」と呼ばれていて、有効数字は約 16 桁あります。 ので 0.99..(17桁) であれば丸められて 1 になります。
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
誤解するといけないのでHanzoさんのレスに補足しておきます。 プチコン3号上で?1==0.999999999としてみてください。0と表示されたと思います。これは1と0.999999999は等しくないことを意味します。 これは実はプチコン3号の有効桁数は15~16桁(内部では2進数で52桁)であるためです。 ?1==0.9999999999999999(9が16個)では0と表示されますが、?1==0.99999999999999999(9が17個)では1と表示されてプチコン3号上この値は1と同値です。 プチコン3号では普通に表示したら小数第9位で四捨五入して表示されますが、正確に表示したいという場合は私の自作関数PSTR$を使えば簡単に表示が可能です。 https://miiverse.nintendo.net/posts/AYIHAAAEAABEVRTp-ZVMIg
0そうだね
プレイ済み
返信[7]
親投稿
MIKI ifconfig
なお、おちゃめさんが、倍精度浮動小数点数を常に正しく文字列に変換してくれる pstr$ 関数を公開しています。 https://miiverse.nintendo.net/posts/AYIHAAAEAABEVRTp-ZVMIg
0そうだね
プレイ済み
返信[8]
親投稿
Hanzo rzsense
>MIKIさん、おちゃめさん: 私の間違いをご指摘いただきまして、ありがとうございます。 >けんたこさん: 小数第9位以下が変わってしまうのは、MIKIさんのご指摘によれば、PRINT(?)命令の仕様です。 一方、プチコンで普通に使われる変数は、全部で64ビットあり、このうち11ビットが数字を表す部分、1ビットがプラスマイナスを表す部分で、残り52ビットが、おちゃめさんがおっしゃるとおり、桁数(小数点の位置)を表す部分になっています。 このように、桁数部分は52ビットもあるので、プチコンの内部では、少なくとも小数第9位よりはずっと小さい数も扱えますが、表示の仕様上、勝手に変わってしまうわけですね。 これを防ぐには、おちゃめさんが公開されているPSTR$関数が最適ということです。
1そうだね
プレイ済み