> > 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に問題が有るかどうかは、実機で確認する以外にわからないと思います。