Indeks English versionEnglish version

Elektronika MK-85 - algorytmy

Funkcja RAN# (podprogram w ROM 2FC6)

Kalkulator w rzeczywistości oblicza pseudolosowe liczby naturalne w przedziale 0-32767. W celu otrzymania liczby rzeczywistej w przedziale 0-0.9999... wynik jest później mnożony mnożony przez 0.30517578125E-4 (=1/32768).

Poniższy program w języku BASIC oblicza liczby pseudolosowe używając tego samego algorytmu jak wbudowana funkcja RAN#. Dla porównania wyświetlane są również wartości generowane przez RAN#.

10 S=32768*RAN#
20 S=12869*S+6925
30 S=S-32768*INT(S/32768)
40 PRINT S;32768*RAN#
50 GOTO 20

Pierwiastek kwadratowy (podprogram w ROM 300E)

Poniższy program w języku BASIC przedstawia algorytm używany w mikrokomputerze MK-85. Oblicza pierwiastek kwadratowy dla liczb w przedziale 1 do 99.9999... z dokładnością R cyfr.

Oryginalna procedura używa tylko prostych i wydajnych operacji matematycznych: przesunięć, dodawania/odejmowania, porównywania i przeglądania tablic. W języku BASIC trzeba było zastąpić operację przesunięcia za pomocą mnożenia przez potęgi 10.

Algorytmy działania tej i następnych funkcji są szczegółowo opisane w artykule J.E. Meggitt, Pseudo Division and Pseudo Multiplication processes, IBM Journal, Res & Dev, April 1962.

5 R=7
10 INPUT "Argument=",A
20 IF A<1 THEN 40
30 IF A<100 THEN 50
40 PRINT "Poza zakresem!":GOTO 10
50 B=1:Q=0:J=0

200 IF J>=R THEN 600
210 IF A<B THEN 400

300 A=A-B
310 GOSUB 800
320 B=B+2*D
330 Q=Q+1
340 GOTO 200

400 A=10*A
410 B=B-D
420 Q=10*Q
430 J=J+1
440 GOSUB 800
450 B=B+D
460 GOTO 200

600 PRINT "SQR=";Q/10^R
610 GOTO 10

800 D=10^-J
810 RETURN

Funkcja EXP (podprogram w ROM 30A2)

Poniższy program w języku BASIC oblicza EXP(x) dla liczb w zakresie 0 do LN(10) z dokładnością R cyfr. Używa takiego samego algorytmu jak oryginalny kod w pamięci ROM mikrokomputera MK-85.

10 R=7:IF R>6; DEFM(R-1)
20 FOR J=0 TO R-1
30 T(J)=LN(1+10^-J)*10^J
40 NEXT J

100 INPUT "Argument=",A
110 IF A<0 THEN 130
120 IF A<LN(10) THEN 140
130 PRINT "Poza zakresem!":GOTO 100
140 Q=0:J=0
150 GOTO 500

200 IF J>=R THEN 600
210 IF A<B THEN 400

300 A=A-B
310 Q=Q+1
320 GOTO 200

400 A=A*10
410 Q=Q*10
420 J=J+1

500 B=T(J)
510 GOTO 200

600 A=0:B=10^R

700 IF FRAC(Q/10)<>0 THEN 800
710 IF Q<>0 THEN 900
720 GOTO 1000

800 M=INT(B/10^J)
810 A=A+B
820 B=B+M
830 Q=Q-1
840 GOTO 700

900 A=INT(A/10)
910 Q=INT(Q/10)
920 J=J-1
930 GOTO 700

1000 PRINT "EXP=";1+A/10^(R+J)
1010 GOTO 100

Logarytm naturalny (podprogram w ROM 31AC)

Poniższy program w języku BASIC oblicza LN(x) dla liczb w zakresie 1 do 10 z dokładnością R cyfr. Używa takiego samego algorytmu jak oryginalny kod w pamięci ROM mikrokomputera MK-85.

10 R=7:IF R>6; DEFM(R-1)
20 FOR J=0 TO R-1
30 T(J)=LN(1+10^-J)*10^J
40 NEXT J

100 INPUT "Argument=",A
110 IF A<1 THEN 130
120 IF A<10 THEN 140
130 PRINT "Poza zakresem!":GOTO 100
140 Q=0:B=1:J=0
150 A=A-1

200 IF J>=R THEN 500
210 IF A<B THEN 400

300 M=B*10^-J
310 A=A-B
320 B=B+M
330 Q=Q+1
340 GOTO 200

400 A=A*10
410 Q=Q*10
420 J=J+1
430 GOTO 200

500 A=0
510 GOTO 900

600 IF 10*FRAC(Q/10)<>0 THEN 700
610 IF Q<>0 THEN 800
620 GOTO 1000

700 A=A+B
710 Q=Q-1
720 GOTO 600

800 A=INT(A/10)
810 Q=INT(Q/10)
820 J=J-1

900 B=T(J)
910 GOTO 600

1000 PRINT "LN=";A*10^-J
1010 GOTO 100

Arcus tangens (podprogram w ROM 33E4)

Poniższy program w języku BASIC oblicza ATN(x) dla liczb w zakresie 0 do 1 z dokładnością R cyfr. Używa takiego samego algorytmu jak oryginalny kod w pamięci ROM mikrokomputera MK-85.

10 R=7:IF R>6; DEFM(R-1)
20 FOR J=0 TO R-1
30 T(J)=ATN(10^-J)*10^J
40 NEXT J

100 INPUT "Argument=",A
110 IF A<0 THEN 130
120 IF A<1 THEN 140
130 PRINT "Poza zakresem!":GOTO 100
140 Q=0:B=1:J=0

200 IF J>=R THEN 500
210 IF A<B THEN 400

300 M=A*10^(-2*J)
310 A=A-B
320 B=B+M
330 Q=Q+1
340 GOTO 200

400 A=A*10
410 Q=Q*10
420 J=J+1
430 GOTO 200

500 A=0
510 GOTO 900

600 IF 10*FRAC(Q/10)<>0 THEN 700
610 IF Q<>0 THEN 800
620 GOTO 1000

700 A=A+B
710 Q=Q-1
720 GOTO 600

800 A=INT(A/10)
810 Q=INT(Q/10)
820 J=J-1

900 B=T(J)
910 GOTO 600

1000 PRINT "ATN=";A*10^-J
1010 GOTO 100

Tangens (podprogram w ROM 362C)

Poniższy program w języku BASIC oblicza TAN(x) dla liczb w zakresie 0 do PI/2 radianów z dokładnością R cyfr. Używa takiego samego algorytmu jak oryginalny kod w pamięci ROM mikrokomputera MK-85.

10 MODE 5:R=7:IF R>6; DEFM(R-1)
20 FOR J=0 TO R-1
30 T(J)=ATN(10^-J)*10^J
40 NEXT J

100 INPUT "Argument=",A
110 IF A<0 THEN 130
120 IF A<PI/2 THEN 140
130 PRINT "Poza zakresem!":GOTO 100
140 Q=0:J=0
150 GOTO 500

200 IF J>=R THEN 600
210 IF A<B THEN 400

300 A=A-B
310 Q=Q+1
320 GOTO 200

400 A=A*10
410 Q=Q*10
420 J=J+1

500 B=T(J)
510 GOTO 200

600 A=0:B=10^R

700 IF 10*FRAC(Q/10)<>0 THEN 800
710 IF Q<>0 THEN 900
720 GOTO 1000

800 M=INT(A*10^(-2*J))
810 A=A+B
820 B=B-M
830 Q=Q-1
840 GOTO 700

900 A=INT(A/10)
910 Q=INT(Q/10)
920 J=J-1
930 GOTO 700

1000 PRINT "TAN=";A/B/10^J
1010 GOTO 100