投稿
おちゃめ ochame_nako
表示の見た目通りの値を返すPR関数を作りました。これはチョー使える関数です。 この関数の仕組みやプチコン3号の表示の仕組みはコメントにて。
9そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
プチコン3号では2.2250738585072014E-308という小さな数が扱えますが、PRINT命令で普通に表示した場合には5E-9未満の数は0と表示されます。 5E-9は当然0ではありませんが、これはPR関数を使いPR(4E-9)とすることで0にできます。 また5E-9は四捨五入されて表示上では0.00000001となっていますが、当然5E-9(0.000000005)は0.00000001ではないですね。 しかし、PR(5E-9)とすることで0.00000001にしてくれます。
1そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
この時点では何のことやら分からない人もいると思うのでA=0.1*29としてみてください。 これは暗算でも計算できるしPRINT Aとすれば2.9と表示されますね。 こんなのは当たり前だと思うかもしれません。 しかし、プチコン3号は内部では2進数で計算されているため「0.1」が正確に表現できないので「2.9」というのは先ほどの5-E9が0.00000001になったように内部で表現されている値と見た目の値が異なっています。 PRINT A==2.9とすると0(false)になっているため0.1*29はプチコン3号では2.9にはならないことを示しています。 つまり、「Aの値が2.9の場合」という判定は行ってはいけないのです。
2そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
ここで役に立つのがPR関数です。 PR(A)とすれば2.9を返しますが、PRINT PR(A)==2.9は1(true)になります。 つまり、PR関数を使うことで内部の表現を気にせず見た目通りの判定が可能になるということです。 実数型で小数を扱った演算を行う場合には見つけにくいバグとなってしまうのですが、PR関数を使えばその問題を解決できるというわけです。(小数を扱う場合には==を使った判定は本来はタブーとされているくらい)
1そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
あとIF A==0 THEN A=0は一見無意味な処理に見えますね。 これはプチコン3号では負数の値をROUND関数で丸め処理を行い0になった時には表記上は符号がマイナスのままになってしまうという仕様(バグ?)があるのですが、これは見た目が良くないためマイナスの符号を取り除くためこのような処理を行っています。 ちなみに整数部が8桁以上になる場合は別途判定を行わないと「見た目通り」という仕様とは異なるものになってしまうのですが、リストが長くなるし処理速度も桁違いに遅くなってしまうし、使用頻度から言ってほとんど無駄な処理であるためシンプルかつ高速にするためこういう仕様(見た目通りなのは整数部が7桁以下の場合のみ)とさせていただきます。
1そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
ちなみにPRはPrint Roundの略で表示丸め関数を示しています。(宣伝ではない) 誤動作防止のためにはたくさんの場所で使うことになるため2文字に略しました。
0そうだね
プレイ済み