SBC6502 - 59 - basic programs - výpočet čísla Π, iná verzia.

By Administrator at októbra 03, 2022 12:00
Filed Under: SBC6502

Už sme sa oboznámili s výpočtom čísla Pi v 44. pokračovaní pre SBC6502, dnes si pozrieme iné riešenie toho istého výpočtu. Program zobrazuje pri výpočte aktuálne číslo ktoré sa práve počíta v celom reťazci. Celé číslo Pi je zobrazené az po skončení celého výpočtu. Zase raz prvý riadok programu je špecifický iba pre SBC6502, program funguje aj bez neho. Je to pekná ukážka ako sa dopracovať k rovnakému výsledku inou programovou cestou. Špecifický je tiež riadok 70 a 180, ale dá sa fungovať aj na iných počítačoch - stačí namiesto PRINT CHR$(12) zadať príkaz CLS ktorý SBC6502 nemá.

 

 

Listing programu:


10 ? CHR$(12):POKE 15,79
11 REM PI CALCULATOR SBC6502 32kB RAM
15 L=3:H=1000
25 PRINT
30 INPUT "NO OF TERMS ";T
31 T=INT(T)
35 B=INT(T/L+.5)+2
40 DIM P(B),T(B)
50 T(B-1)=H/2:P(B-1)=H/2
60 FOR N=1 TO T
70 PRINT CHR$(12);"COMPUTING TERM ";N
80 X=2*N-1:GOSUB 300:GOSUB 300
90 X=8*N:GOSUB 400
100 X=2*N+1:GOSUB 400
110 GOSUB 500:NEXT N
120 C=0:FORI=1 TO B
130 P(I)=P(I)*6+C
140 C=INT(P(I)/H)
150 P(I)=P(I)-C*H
160 NEXT I
180 PRINT CHR$(12);P(B);
CHR$(8)".";
190 FOR I=B-1 TO 2 STEP-1
200 PRINT RIGHT$(STR$(P(I)+10*H),L);
210 NEXT
220 END
300 C=0:FOR I=1 TO B
310 T(I)=T(I)*X+C
320 C=INT(T(I)/H)
330 T(I)=T(I)-C*H
340 NEXT:RETURN
400 C=0:FOR I=B TO 1 STEP-1
410 Z=T(I)+C:C=0
420 Q=INT(Z/X):T(I)=Q
430 C=H*(Z-Q*X)
440 NEXT:RETURN
500 C=0:FOR I=1 TO B
510 P(I)=P(I)+T(I)+C:C=0
520 IF P(I)<H THEN 540
530 P(I)=P(I)-H:C=1
540 NEXT:RETURN   

 

Pi.txt (868,00 bytes)

 

Ukážky behu programu:

Zvolený výpočet na 100 miest.

 

Práve počíta 43 miesto.


Výpočet ukončený, zverejnený výsledok.

 

 

Ukážka pre riadok 180:

180 PRINT CHR$(12);P(B);".";

(Ak sa v tomto riadku nezadá aj CHR$(8) tak vznikne výpis na termináli 3 .14 atď kde je potom medzera medzi číslicou 3 a bodkou, namiesto požadovaných 3.14. Iným dôsledkom použitia CHR$(8) je to že v prvom riadku výpisu je potom odskok na druhý riadok o jedno miesto skôr, ale s tým som sa už nebabral ..., nakoniec na tak veľký počet desatinných miest (nad viac ako 15) sa naozaj chodí iba občas - nakoniec pozrite si na wikipedii s akou presnosťou čísla Π pracuje samotná NASA ...


Ešte sa pozrieme na to koľko trvá výpočet pre 100 miest čísla Π na SBC6502:


s použitým x-talom=4.9152MHz je to presne: 1min 09sec.,

(pre 4.00MHz x-tal  je to 1min27sec).

Vidieť že výpočet pomocou tohoto programu je o poznanie rýchlejší ako program v pôvodnom článku kde je síce použitý o niečo menej "nadupaný" x-tal=4.00MHz - ale je tam dosiahnutý čas =5min 38sec čo na taký veľký rozdiel v dosiahnutom čase neoprávňuje.

Poznámka:

Program je priamo funkčný aj pre Micro UK101.


Pôvodný článok:

SBC6502 - 44 - výpočet čísla Pi. Number Pi and its calculation on SBC6502.

 

Poďme na nejaké to porovnanie rýchlosti výpočtu:

 

Výpočet Pi na 2038 miest v pôvodnom článku (v odkaze) trval: 38 hodín a 12 minút, počítalo to 53.375 čísla za hodinu, alebo inak - jedno číslo počíta skoro 67.5 sekundy,

 

Program uverejnený na začiatku dnešného článku to napríklad na UK101 a 4.00MHz x-tale spočíta na 2038 miest za 9 hodín 54 minút a 45 sekúnd, počíta to 205.714 čísla za hodinu, teda výpočet jedného čísla trvá 17.5 sekundy. Oproti prvému programu je to skutočne viac ako citeľné zrýchlenie samotného výpočtu.

(SBC6502 a UK101 na rovnakom x-tale 4.00MHz sú rovnako rýchle, používajú ten istý Basic, v tej istej verzii.)

____________________________________________________________


Samotný zápis uvedeného programu sa dá výrazne skrátiť stlačením do menšieho počtu riadkov, i keď je to na úkor jeho prehľadnosti, program je samozrejme naďalej funkčný.


Listing /redukovanej veľkosti/ programu:


10 ? CHR$(12):POKE 15,79: L=3:H=1000:?
11 REM PI CALCULATOR SBC6502 32kB RAM
30 INPUT "NO OF TERMS ";T:T=INT(T):B=INT(T/L+.5)+2
40 DIM P(B),T(B):T(B-1)=H/2:P(B-1)=H/2
60 FOR N=1 TO T:? CHR$(12);"COMPUTING TERM ";N
80 X=2*N-1:GOSUB 300:GOSUB 300:X=8*N:GOSUB 400:X=2*N+1
110 GOSUB 400:GOSUB 500:NEXT N:C=0:FORI=1 TO B
130 P(I)=P(I)*6+C:C=INT(P(I)/H):P(I)=P(I)-C*H:NEXT I
180 ? CHR$(12);P(B);CHR$(8)".";:FOR I=B-1 TO 2 STEP-1
200 ? RIGHT$(STR$(P(I)+10*H),L);:NEXT:END
300 C=0:FOR I=1 TO B:T(I)=T(I)*X+C:C=INT(T(I)/H)
330 T(I)=T(I)-C*H:NEXT:RETURN
400 C=0:FOR I=B TO 1 STEP-1:Z=T(I)+C:C=0:Q=INT(Z/X):T(I)=Q
430 C=H*(Z-Q*X):NEXT:RETURN
500 C=0:FOR I=1 TO B:P(I)=P(I)+T(I)+C:C=0:IF P(I)<H THEN 540
530 P(I)=P(I)-H:C=1
540 NEXT:RETURN 

 

Pi_r.txt (746,00 bytes)

______________________________________________________

Vaše hodnotenie, Rate post:

Comments

4. 10. 2022 7:05:55 #

trackback

Directory SBC6502

Directory SBC6502

Igi blog |

Info o autorovi

Volám sa Igor Gramblička, bydlisko: Bratislava, Slovakia. Môj nick: Igi. Blog je o mojich záujmoch, predtým som pracoval ako IT špecialista na počítačové siete a redakčné systémy pre viaceré denníky - až som pred rokmi nakoniec v jednom z nich zakotvil a kde som to potiahol až do konca mojej profesnej kariéry.

Rok, mesiac, počet článkov: