|
十進BASIC Ver.7, Ver.8 では,
十進モードのとき,数値変数の精度は15桁,数値式の精度は16桁超,
2進モードのとき,数値変数は倍精度(仮数部53ビット),数値式は拡張精度(仮数部64ビット)です。
なので,十進モード,2進モードのいずれでも,変数に代入しなければ,1E8以下の数の平方は正確に計算されます。
Windows版BASICAccが生成する64ビットコードは,途中の計算まで含めてすべて倍精度で処理するので,2^53を超える数値を正確に扱うことができません。
(Win64版以外のBASICAccは,計算の途中結果を拡張精度で計算する可能性があります)
次のプログラムを実行してみると,途中がどうなっているかわかると思います(580行)。
100 PRINT ISPRIME(94910639) !94910639 素数 (5484841st)
110 END
120 EXTERNAL FUNCTION ISPRIME(N)
140 IF N = 2 THEN
150 LET ISPRIME=1
160 EXIT FUNCTION
170 END IF
180 IF N = 1 OR MOD(N , 2) = 0 THEN
190 LET ISPRIME=0
200 EXIT FUNCTION
210 END IF
220 LET D = (N - 1) / 2
230 LET S = 0
240 DO WHILE MOD(D , 2) = 0
250 LET D = INT(D / 2)
260 LET S=S+1
270 LOOP
280 FOR I=1 TO 10
290 LET ISP=0
300 READ A !' n < 341550071728321 なら a = 2, 3, 5, 7, 11, 13, 17
310 DATA 2,3,5,7,11,13,17,23,29,31
320 LET ISP = 0
330 LET R = POWMOD(A, D, N)
340 IF R = 1 OR R = N - 1 THEN
350 LET ISP = 1
360 END IF
370 LET R = POWMOD(R, 2, N)
380 FOR J = 0 TO S-1
390 IF R = N - 1 THEN
400 LET ISP = 1
410 END IF
420 LET R = POWMOD(R, 2, N)
430 NEXT J
440 IF ISP=0 THEN
450 LET ISPRIME=0
460 EXIT FUNCTION
470 END IF
480 NEXT I
490 LET ISPRIME=1
500 END FUNCTION
510 EXTERNAL FUNCTION POWMOD(B,P,M)
520 !OPTION ARITHMETIC RATIONAL
530 LET RESULT = 1
540 DO WHILE P > 0
550 IF MOD(P , 2)= 1 THEN
560 LET RESULT = MOD(RESULT * B , M)
570 END IF
580 PRINT USING "######## ################": B , B * B
590 LET B = MOD(B * B, M)
600 LET P = INT(P / 2)
610 LOOP
620 LET POWMOD=RESULT
630 END FUNCTION
|
|