タイトル | : Re^2: PRIME88.BAS で 「169=素数?」問題 |
投稿日 | : 2024/04/06(土) 02:05 |
投稿者 | : konno | 番 号 | : 11195 11192 番 としき さんへのコメント コメント数 2 |
> > PN88.BAS> > 110 defdbl a-z '倍精度指定>> ここを単精度指定にしたらどうなるか、ということ。> とても興味があります。丁度良いテストプログラムを作ったので上げます。 3000 ' SQR88.BAS 3010 'defdbl a-z 3012 defsng a-z 3020 'screen 0 3030 cls 3040 input s 3042 OPEN "SQR.dat" FOR OUTPUT AS #1 3046 cc=0 3050 x = s / 2.0 '; // Is there any better way to determine initial value? 3060 lastx = 0.0 '; // the value one before the last step 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 3124 close 3130 input a 3140 end このプログラムで、TurboBasic の結果は 単精度 43.25 84.5 1 23.57875633239746 43.25 2 15.37311267852783 23.57875633239746 3 13.18316555023193 15.37311267852783 4 13.00127220153808 13.18316555023193 5 13 13.00127220153808 6 13 13 7 SQR( 169 )= 13 13 7 回 倍精度 43.25 84.5 1 23.57875722543352 43.25 2 15.37311286945074 23.57875722543352 3 13.18316604902914 15.37311286945074 4 13.00127244856782 13.18316604902914 5 13.00000006226796 13.00127244856782 6 13 13.00000006226796 7 13 13 8 SQR( 169 )= 13 13 8 回 倍精度の方が収束するのに1回多く掛かっています。 どちらでも計算は倍精度でやっているのがわかります。 一方、N88BASIC の結果は 単精度 43.25 84.5 1 23.5788 43.25 2 15.3731 23.5788 3 13.1832 15.3731 4 13.0013 13.1832 5 13 13.0013 6 13 13 7 SQR( 169 )= 13 13 7 回 倍精度 43.25 84.5 1 23.57875722543353 43.25 2 15.37311286945074 23.57875722543353 3 13.18316604902914 15.37311286945074 4 13.00127244856782 13.18316604902914 5 13.00000006226796 13.00127244856782 6 13 13.00000006226796 7 13 13 8 13 13 9 SQR( 169 )= 13 13 9 回 おや、単精度の場合は SQR の計算も単精度なのか、それとも表示だけなのか? 倍精度では収束したのにさらにもう1回多く計算しています。??? この結果は、WHILE 文にしても同じでした。 そして、単精度の時だけ 169 が素数と誤判定しているのです。 このことから私は、「>」や「>=」などの比較式で単精度の時だけ誤差が出ていると疑ったのです。 V6.0に問題が有るかどうかは、実機で確認する以外にわからないと思います。
- No.11195 一括表示へ - コメント元:11192 一括表示へ - [ 返信 ] [引用無し] pre