投稿
おちゃめ ochame_nako
数値を文字列に変換するときは普通はSTR$を使用しますが、その場合は有効桁数が少なくなってしまいゲームのセーブデータなどで支障が出る場合も多いです。 そこで誤差ゼロで数値を文字列に変換できるPSTR$関数を作りました。 これは非常に便利ですよ。 詳細はコメントにて。
12そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
例えばPI関数の値を表示させた場合はこんな感じです。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
普通にPRINT PI()で表示すれば3.14926535と表示されます。 しかし、STR$で文字列に変換してしまうと3.14159になってしまいます。 これはすでに丸められた値なのでVALで数値に変換しても3.14159のままです。 3.14159という値がPI関数の値と等しいかを判定した場合には当然falseになります。 文字列に変換する前の3.1415926535であってもPI関数の値と等しいかを判定すればfalseになります。 そこで出てくるのが今回のPSTR$です。 このPSTR$で文字列に変換すると3.1415926535897931になり普通は表示されない部分まで確認できます。 そして、この値をVALで数値に変換してPI関数の値と等しいかを判定したら何とtrueになります。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
数値を誤差ゼロで文字列に変換できるというのは非常に大きなメリットがあります。 最初に書いたようにセーブしたら値が変わるなんて心配もないし、プログラムが誤動作した際に変数の値が適切な値になっているかのチェックに使用することもできます。 変換誤差による条件判定の誤動作もなくなります。 プチコン3号ではSTR$はイマイチですが、その代わりに便利なFORMAT$があります。 しかし、このFORMAT$は適切な表示設定にするのが初心者には難しいし、非常に大きな数を表示したら0が羅列されて非常に分かりにくくなってしまいます。 ゲームのスコア表示等ではFORMAT$が活躍できますが、それ以外の用途だと今回作ったPSTR$が使い勝手が良いと思います。 FORMAT$を使い誤差ゼロで文字列に変換するのはプチコン3号の有効桁数に関して熟知しておかないと難しいですがPSTR$は非常に簡単です
0そうだね
プレイ済み
返信[4]
親投稿
MIKI ifconfig
pstr$(1e30) が "1e29" になるような気がします。 10行目で z=29 になります。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
みき★さんへ このPSTR$関数は数値演算を行わず文字列演算のみで求めているため誤差が発生しない(数値演算で求めるにはシフト演算によって求めない限りは誤差が発生する)のですが、小数点の位置を求めるためにLOGを使っているのでそこで発生する誤差によるバグは当初は想定してなかったです。 第2回コードゴルフを行う前に気づいていたのでPSTR$もその後にこっそり修正しようと思ったのですが、そのコードゴルフが諸事情のため未だにまとめが終わってないのでPSTR$のバグも未だに未修整の状態でどうもすみません。 これはLOGを使わなければ済む話でS$をINSTRで小数点の場所を調べてあとはS$の先頭から符号と小数点を除き0以外の数字が出てくる場所を調べればLOGで得ようとしていた値と同じものは簡単に得ることはできます。 (下記に続く)
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
上記のコードくらいならば数分あれば書けると思い職場でトイレに行くついでにポーチの中に3DS入れてこっそり書こうとしたのですが、ポーチから出した瞬間にうっかり手を滑らせてしまい和式便器の中に落としてしまいました。 水没してすぐに拾い出したので電源が入ったもののボタンが使用不能になってしまいました。 これが和式ではなく様式だったらただの落下で済んだので助かったと思うと悲しいですが、していたのが大ではなく小だったのでウンこそ無かったけど不幸中の幸いといった感じです。 というわけで、PSTR$の修正リストは修理に出すか、新しい本体を買うまでお待ち下さい。
0そうだね
プレイ済み
返信[7]
親投稿
MIKI ifconfig
り、了解です。 復活お待ちしております。 文字列的に処理するだけだったらなんとかなりそうです。 var 関数を使った、変数のセーブロード関数作ってるのですが、数値の保存に pstr$ 使おうと思ってたのでした。
0そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
みき★さんへ 3日間放置したら自然に直りました。 PSTR$のLOGの演算誤差に伴うバグ修正ならば簡単にできたのですが、せっかくなので以前から考えていたコードの全面見直しと「非正規化数への対応」などの機能の追加を行いました。 新しいトピックスにて詳しい解説付きで公開しているのでぜひご覧になってください。 https://miiverse.nintendo.net/posts/AYIHAAAEAABEVRTp-ZVMIg
0そうだね
プレイ済み