ST-BASIC - Vergleich von Genauigkeit und Geschwindigkeit

Genauigkeit bei der Zahlendarstellung

Wenn man mit einem Computer arbeitet geht man meist davon aus, daß die Ergebnisse, die man bei Rechenoperationen erhält stimmen. Wenn man sich näher mit dem Computer beschäftigt und wie er Rechenoperationen durchführt, dann versteht man, daß dies nicht immer der Fall sein kann. Während Taschenrechner meist mit BCD-Zahlen, also dezimal, rechnen wandeln Computer im allgemeinen eingegebene Dezimalzahlen in Dualzahlen um. Bei dieser Umwandlung entstehen Rundungsfehler, weil der Rechner nur eine begrenzte Anzahl von Stellen für die Mantisse zu Verfügung stellt. Das ATARI ST BASIC stellt bei einfacher (normaler) Genauigkeit nur sechs Stellen zur Verfügung. Wenn man Variablen als ’Doppelgenaue’ definiert, erhält man neunstellige Ergebnisse. Doch ist dabei nur die siebte Ziffer noch eine ’Echte’. Die beiden anderen scheinen durch Zufall zu entstehen. Hier ein paar Beispiele:

Eingabe:
123456
1234567
100000.9
999999*10
999.999
9.9
3.1415
Ausgabe: einfach-
123456
1.2345E + 06
100000
9.9998E+06
999.998
9.89999
3.14149
doppeltgenau
123456
1234567.04
100000.9
9999989.76
999.998976
9.89999936
3.14149984
**Tabelle 1**

Man muß diesem Basic deshalb eine schlechte Genauigkeit anlasten, zumal selbst doppeltgenaue Variablen nur magere sieben relevante Stellen liefern. Der IBM AT kann hier zum Beispiel 7 bzw. 17 Stellen aufweisen und selbst der Commodore 64 bringt 8 Stellen, ohne die Möglichkeit der doppelten Genauigkeit zu besitzen. Die Ungenauigkeiten, die sich daraus ergeben, sollten jedem Programmierer, bzw. Anwender klar sein, weil er sonst Ergebnisse oder Fehler nicht erkennen bzw. richtig beurteilen kann. Die einfachen Beispiele aus Tabelle 1 verdeutlichen in ausreichender Weise, daß der Rechner selbst bei einfachsten Zahlenausgaben keine exakte Darstellung liefert.

Auch die Integervariablen (mit dem %-Zeichen gekennzeichnet) haben Besonderheiten, wobei sich diese aus den oben angegebenen Gründen erklären lassen. Bei bis zu sechs Stellen hinter dem Komma ist das Ergebnis tatsächlich der Integer dieser Zahl, ab sieben Stellen wird es jedoch interessant. Bleibt man unter einundzwanzig Stellen wird es jedoch interessant. Bleibt man unter einundzwanzig Stellen, so ist die Sache noch harmlos, die Zahl ist dann der aufgerundete Integerwert. Gibt man nun, aus welchem Grund auch immer, einundzwanzig Stellen ein, so wird das Programm mit der Meldung ’System error #%N, please restart at line...’ abgebrochen. Hier ist also Vorsicht geboten und auch bei zweiundzwanzig Stellen und mehr, denn dann lautet das Ergebnis Null.

Die angesprochenen Fehler werden sicherlich nur selten auftreten, denn wer gibt schon so viele Stellen ein wenn der Rechner nur sechs oder sieben benutzt. Aber etwas ungewöhnlich ist es schon, und andere Basic-Versionen schaffen es doch auch annehmbare Ergebnisse zu liefern.

Zu guter letzt noch ein Beispiel zu einer einfachen Subtraktion.

1.01-0.01-1 = 0
1.01-1-0.01 = -9.31322E-09

Auch hier ist das Ergebnis bemerkenswert, wenn auch der Fehler- mit rund 1E-10 nur sehr gering ist, so zeigt es doch, daß man auch damit vorsichtig umgehen sollte und bei dieser Rechnung z. B. keine Abfrage nach Null machen sollte.

Eine weitere Besonderheit ist der Wertebereich der darstellbaren Zahlen. Er reicht nicht, wie allgemein üblich, von 1E-38 bis 1E+38, sondern nur von ca. 9E-20 bis 5E+18. Bei größeren bzw. kleineren Werten wird wiederum Null ausgegeben.

Wenn man zu diesen Einschränkungen das gesamte Basic beurteilen soll, so muß man ihm einen mächtigen Sprachumfang bestätigen, der jedoch an manchen Stellen Lücken aufweist. Hinzu kommen die in diesem Artikel aufgezählten Mängel und noch einige andere, die jedoch nicht zu diesem Gebiet passen (z. B. GOTOXY, INKEYS). Da das ST-Basic, zumindest zur Zeit, von einer Diskette geladen werden muß, ist es kein großes Problem jederzeit Änderungen daran vorzunehmen. Man kann also hoffen, daß an diesem Basic weitergearbeitet wird und daß dann ein wirklich gutes Basic daraus wird. Gute Voraussetzungen sind dafür zur Genüge gegeben.

Geschwindigkeit des ST-BASIC

Um die Geschwindigkeit des Basics bewerten zu können muß man die Ausführungszeit einzelner Befehle feststellen. Diese kann man dann mit den Zeiten anderer Rechner vergleichen und bewerten. Da die Ausführungszeit im Bereich von einigen Millisekunden liegt, muß man den einzelnen Befehl mehrmals ausführen um die Zeit bestimmen zu können. Dazu wird eine einfache Schleife (siehe Listing) benutzt. Für die Ausführung dieser (Leer-) Schleife benötigt das Programm 8,7 Sekunden. Diese Zeit muß nun bei jeder weiteren Zeitmessung abgezogen werden um die Zeit für das 10000malige Ausführen des Befehls zu erhalten. Teilt man dieses Ergebnis durch 10, so erhält man die Ausführungszeit für einen Befehl in Millisekunden. Die Ausführungszeiten werden denen des GW-Basic auf dem IBM-kompatiblen Commodore PC 10 gegenübergestellt (siehe Tabelle 2). Wie man sieht ist der Interpreter, des ST-Basic sehr schnell. Es gibt fast keinen Unterschied zwischen den Grundrechenarten und den Funktionen SIN, SQR und LOG. Sie benötigen alle nur rund 1,5 Millisekunden für ihre Ausführung. Das GW-Basic ist zum Teil deutlich langsamer. Es benötigt schon für die Grundrechenarten 2 ms. Bei den Funktionen Sinus und Cosinus wird es dann besonders deutlich. Das ST-Basic ist hier mehr als 10mal so schnell. Bei den Funktionen LOG, ATN und SQR holt das GW-Basic zwar wieder auf, doch es erreicht auch hier nicht die Geschwindigkeit des ATARI-Basics. Erst wenn es um die Bildschirmausgabe geht zeigt das ST-Basic Schwächen. Zum Testen sollen die Zahlen 1 bis 1000 mit einer einfachen Schleife auf dem ganzen Bildschirm ausgegeben werden. Geschieht die Ausgabe mit ’PRINT A’, so benötigt das Programm dafür 3 Minuten und 35 Sekunden. Dies ist eine beachtlich lange Zeit. Augenscheinlich hat das ST-Basic Schwierigkeiten mit dem ’Scrollen’ des Bildschirms. Benutzt man nämlich statt des angesprochenen Befehls die Anweisung ’GOTOXY 1,1 : PRINT A’, so werden dafür nur 24 Sekunden benötigt. Das GW-Basic ist hier eindeutig im Vorteil (siehe Tabelle 3).

Bei der Stringverarbeitung liegen die Zeiten beider Rechner im gleichen Bereich. Allerdings hat das GW-Basic auch hier einen Vorsprung.

Anhand eines kleinen Programms läßt sich nun zeigen, daß die so ermittelten Werte tatsächlich eine Auswirkung auf die Programmablaufgeschwindigkeit haben. Dazu wird ein Primzahlenprogramm verwendet, mit dem die Primzahlen bis zum Wert 1000 berechnet werden. Das ST-Basic benötigte dafür 18 Sekunden, das GW-Basic immerhin 30 Sekunden. Würde man allerdings die Werte auch noch auf dem Bildschirm ausgeben wollen, dann würde sich das Verhältnis zugunsten des GW-Basic verschieben.

Zusammenfassend läßt sich sagen, daß das ST-Basic einen ausgewogenen Eindruck macht. Die Ausführungszeit liegt bei fast allen Befehlen in der gleichen Größenordnung. Es übertrifft damit das GW-Basic in fast allen Bereichen. Damit könnte man nun zufrieden sein, doch wenn man sich die Daten der verwendeten CPUs (Tabelle 4) ansieht ist man doch ein wenig enttäuscht. Der ATARI ST ist mit dem 68 000-Prozessor ausgerüstet. Dieser Prozessor kann extern 16 Bit und intern 32 Bit verarbeiten und ist zudem noch mit 8 MHz getaktet. Der PC 10 hat dagegen mit dem 8086-Prozessor nur 8 bzw. 16 Bit zur Verfügung und ist auch nur mit 4,77 MHz getaktet. Nimmt man diese Daten zur Bewertung hinzu, so muß man feststellen, daß das ST-Basic die Fähigkeiten der schnellen CPU nicht ausreichend nutzt. Besonders bei der Stringbehandlung und dem ’Bildschirmrollen’ ist der Basic-Interpreter einfach zu langsam. Wie auch bei der Genauigkeit wäre deshalb ein überarbeitetes Basic wünschenswert.

1  FULLW 2 : CLEARW 2
2  X=0 : Y=9
3  PRINT "START !"
4  FOR A=1 TO 10000
5  ...
6  NEXT A
7  PRINT "STOP !"
8  END
9  RETURN

Listing 1 zu Bestimmung der Ausführungszeiten

BefehlZeit in ms.
ST-BASIC GW-BASIC
(Leerschleife
B=0             
B=9             
B=9.9E-20       
B=X             
B=X+9           
B=X-9           
B=X*9           
B=X/9           
B=X/Y           
B=SIN(Y)        
B=COS(Y)        
B = TAN(Y)      
B=ATN(Y)        
B=LOG(Y)        
B=LOG10(Y)      
B = SQR(Y)      
B=Y 2           
B=EXP(Y)        
B=SGN(Y)        
B=PEEK(Y)       
SWAP X,Y        
IF X>Y THEN 6   
IF X<Y THEN 6   
REM ABCDEFGHIJ  
GOTO 6          
GOSUB 9         
GOSUB programm  
CLEARW/CLS      
o. Fußzeile     
E$ = A$         
E$ = B$         
E$=A+B          
E=RIGHT$(A$,9)  
E$=MID$(A$,5,3) 
X=INSTR(1,A$,"9"
0.87
0.7  
0.9  
0.7  
0.7  
1.4  
1.4  
1.4  
1.4  
1.2  
1.5  
1.5  
2.2  
5.9  
1.6  
2.4  
1.2  
3.0  
1.7  
1.3  
1.5  
0.9  
1.0  
1.3  
0.2  
0.4  
0.8  
0.7
600.0
 
1.4  
0.8  
4.6  
2.1  
2.6  
2.4
1.14)
1.2
1.1
1.0
1.2
2.0
2.0
2.0
2.0
2.0
19.4
24.3
41.0
5.4
7.0
2.6
2.6
4.1
5.0
1.7
2.3
0.7
2.1
2.1
0.6
0.4
0.9
 
270.0
120.0
0.7
0.6
1.8
2,1
2.5
3.1

Tabelle 2: (Anm.: a$ = "1234567890",b$ = "1")

Zeit in min.
PRINT A
PRINT A,
PRINT A;
GOTOXY 1,1:? A
LOCATE 1,1:? A
3:35
1:20
0:35
0:24
0:42
0:37
0:19
 
0:22
Tabelle 3
ATARI ST PC 10
Prozessor 68000 8086
Arbeitsweise:
extern 16 Bit 8 Bit
intern 32 Bit 16 Bit
Taktfrequenz 8 MHz 4,77 MHz

Tabelle 4: Daten der CPUs


MN
Aus: ST-Computer 02 / 1986, Seite 11

Links

Copyright-Bestimmungen: siehe Über diese Seite