> > 169 は、13*13=169 なので、素数では無いと思います。
>
> こっちは大問題ですね。仕様どおりの挙動をしないのですから。
> 倍精度から単精度に精度を落としたことが悪いのか、それとも割り算と掛け算の
> 誤差の問題か。
私は当初 NP2 のCPUエミュレーション等のバグを疑いました。
それで、anex86 でも試したのですが、結果は同じ。98NEXT では固まってしまいました。
次に疑ったのが、BASICコンパイラが壊れていないか。
988/08/24 00:00 61,440 BASICC.COM
中身が壊れているることもありうるので、98実機での結果が知りたいところですね。
条件を色々変えて試しても結果は変わらなかったのですが、ひとつだけ
N88P.BAS
00 INPUT N
10 IF N MOD 2=0 THEN 120 ELSE *ELSE1
20 IF N=2 THEN PRINT "素数" ELSE PRINT "合成数"
30 GOTO *ENDIF1
40 *ELSE1
50 I=3
60 WHILE (I<=SQR(N)) AND (N MOD I<>0)
70 I=I+2
80 WEND
90 IF I<=SQR(N) THEN PRINT "合成数" ELSE PRINT "素数"
200 *ENDIF1
202 input a
210 END
このプログラムでは、169 は「素数」と表示されます。
ところがオリジナルを若干修正した以下
PN88.BAS
00 'pn88.bas
10 defdbl a-z '倍精度指定
000 INPUT n
010 IF (n MOD 2)=0 THEN IF n=2 THEN PRINT "素数" ELSE PRINT "合成数"
020 j!=sqr(n) 'ELSE
030 FOR i!=3 TO SQR(n) STEP 2
040 IF n MOD i!=0 THEN *EXIT1
050 NEXT i!
052 *EXIT1
060 IF i!<=SQR(n) THEN PRINT "合成数";i!;j!
062 IF i!>SQR(n) THEN PRINT "素数";i!;j!
070 input a 'END IF
080 END
このプログラムでは、169 は「合成数」と表示されます。
違いは、変数全体を倍精度にし、FOR 文の変数を単精度にしただけかな。
# うーん、これを反映させても改善しない。何故だー! (;_;)