タイトル | : Re^5: PRIME88.BAS で 「169=素数?」問題 |
投稿日 | : 2024/04/07(日) 01:17 |
投稿者 | : としき |
参照先 | : http://toshiki.la.coocan.jp/ | 番 号 | : 11202 11200 番 としき さんへのコメント コメント数 1 |
訂正、ではないような。 補足、かな。> > よくリストを見たら、結果表示がループの外に出ている。> > こういうトリックはやめて欲しいけど、でも私も良くやるので人のことは言えない。>> 違う。> 結果表示が改行されず、同一行に上書きされているような感じ。> つまり、トリックは私が仕掛けた、ということで。結果表示が上書きのよう、というのはそのとおりなんですが。 結果表示がループの外、というトリックは、やっぱりkonnoさんだった。 #11195より> 3070 'while ( x != lastx ) '// until the difference is not significant> 3090 lastx = x> 3100 x = (x + s / x) / 2.0> 3112 cc=cc+1> 3114 print x;lastx,cc> 3116 print#1, x;lastx,cc> 3110 if x < lastx then 3070> 3120 print "SQR(";s;")=";x,lastx,cc> 3122 print#1, "SQR(";s;")=";x,lastx,ccこれ、行番号順に並んでいないじゃないのよさ。 BASICの場合、行番号順に実行されるわけですから、実行時には> 3070 'while ( x != lastx ) '// until the difference is not significant> 3090 lastx = x> 3100 x = (x + s / x) / 2.0> 3110 if x < lastx then 3070> 3112 cc=cc+1> 3114 print x;lastx,cc> 3116 print#1, x;lastx,cc> 3120 print "SQR(";s;")=";x,lastx,cc> 3122 print#1, "SQR(";s;")=";x,lastx,ccとなるわけでして。 まったくもう。 前にも書いたと思いますが、もうちょっと行番号の並びとかインデントに気を配って プログラムを書いていただけないでしょうか。 バグが混入し易くなりますよ、と、繰り返しお伝えしていますよね。 こうやって、残り少ない人生を無駄にしてしまうわけですから。 でも、このプログラムだと、N88なら、ループ内での途中表示は全くないはず。 つまり、#11195の結果は出ないはず。 すると、あの結果はどうやって出したのだろう。 結果の出たあと、プログラムを書き換えてからアップした? 違う処理系での結果をN88での結果と間違えて書いた? それはさておき。 ゆっくり入浴していたときにつらつらと思い出したこと。 大学時代の情報処理初級の授業で、丸め誤差と打切り誤差、桁落ち、情報落ちの 違い、なんてことをやったわけですよ。もはやほとんど覚えていませんがね。 そして、そういった誤差をなくすための方法として多倍長精度演算というのがある、 ということも思い出しました。こいつをやるとてきめんに遅くなるのですが、誤差も 非常に少なくなる。多倍長用のuBASICというのを知ったのは、確か私が大学を卒業 した直後ぐらいだったか。 多倍長っていうのは、例えば、1バイトに数字一桁しか格納しない、という方法。 実際の実装では、そんなことやっていたらメモリ効率が悪いので、1バイトに0から 99までの2桁の数字を格納する、なんていうのが多いかな。86のアセンブラにも それようの命令があったんじゃないかな、BCD演算、というやつ。Z80にはあった ような気がする。 そしてアセンブラにあるくらいだからBASICにもあるわけでして、もしかしたら上記 のuBASICがそうだったかもしれないけど、10進BASICという実装があったはず。 で、話を戻して、誤差。> 3110 if x < lastx then 3070こいつを> 3110 if x < lastx then print "div=",lastx-x:goto 3070とやってみたらどうでしょう。 1回多くループするところで、いったい何がおきているのか見えてくるかも。
- No.11202 一括表示へ - コメント元:11200 一括表示へ - [ 返信 ] [引用無し] pre