Hermann Flessner Aus der Festschrift für das Symposium im Jahre 2006 des Deutschsprachigen Studienganges Wirtschaftsinformatik „Konrad Zuse“ an der Universität Szczecin / Stettin Numerik in digitalen Methoden Zusammenfassung: Für Rechenaufgaben aller Art verwenden wir heutzutage Computer mit Programmen, welche die kompliziertesten Algorithmen in jeder geforderten Genauigkeit verarbeiten. Da derartige Programme immer seltener vom Benutzer selbst geschrieben werden, sondern aus Programmbibliotheken stammen, kann er die Abläufe kaum noch durchschauen. Gerade sehr komplexe Programme werden dabei meistens mit großer Rechensicherheit durchgeführt, sehr einfache überraschenderweise häufig aber nicht. Mit der vorliegenden Arbeit soll eine Artikelserie über digitale Methoden eingeleitet und der Einstieg in das Verständnis der Problematik vorbereitet werden. Bei der Codierung mathematischer Regeln lassen sich nämlich Kunstgriffe über digitale Methoden anwenden und dabei gleichzeitig Fehlrechnungen vermeiden. Einleitung Bei unseren alltäglichen Rechenaufgaben sind den meisten jungen, hoch zivilisierten Menschen Fähigkeiten wie Kopfrechnen weitgehend abhanden gekommen oder gar nicht erst beigebracht worden. Man beobachte im Supermarkt, wie manchmal Damen im Rentenalter jungen Verkäuferinnen schnell und sicher nachweisen, daß sie sich beim Eingeben der Preise in die Kassentastatur vertippt haben. Junge Leute haben eben heute Taschenrechner. Das Vertrauen in diese modernen Recheninstrumente ist zwar bestimmt gerechtfertigt, doch muß man sie sicher bedienen können und im passenden Augenblick auch zur Hand haben – so weit, so gut. Unsere allgegenwärtigen Computer, besonders PC's oder Notebooks, verdienen solches Vertrauen wohl ebenfalls. Jedenfalls wenn man sicher sein kann, daß auch deren Programmierung richtig ist. Dabei sind aber gerade bei Programmen und Betriebssystemen, die in letzter Zeit entstanden sind, interessante Ungereimtheiten festzustellen. Geht man diesen auf den Grund, findet man meistens heraus, daß gewisse Fehler gar nicht infolge falscher Bedienung oder Programmierung hervorgerufen wurden, sondern durch Mißachtung gewisser Regeln für die numerische Verarbeitung bei der mathematischen Aufbereitung der zu programmierenden Formeln. Oft hat man einfach auf die immens großen Gültigkeitsbereiche und Genauigkeiten der im Computer verarbeiteten Zahlen vertraut. Daß Divisionen sehr großer durch sehr kleine Zahlen auch heute noch problematisch sind, hat man wohl verdrängt. Man denkt vielleicht, ob das überhaupt noch sein kann? Bei Zahlengültigkeiten in Bereichen zwischen 10-99 und 10+99, wie sie heute in jedem Taschenrechner eingehalten werden? Man stelle sich 10+99 als Zahl mit 101 Stellen und 100 „Nullen” vor 1 . Sie würde ausgeschrieben 1½ Zeilen dieses Textes in Anspruch nehmen. Da kann doch gar nichts schief gehen, oder etwa doch? – In diesem Beitrag soll gezeigt werden, wie leicht man schon bei einfachen Rechenvorgängen eines Besseren belehrt wird und welche Folgen sich daraus ergeben können. Zu Beginn sei das Grundsätzliche des Zahlenrechnens kurz in Erinnerung gebracht und herausgestellt, welche Konsequenzen KONRAD ZUSE schon als junger Mann im Alter von 25 Jahren bei seinen bahnbrechenden Arbeiten zog, als er das halblogarithmische Zahlensystem für seine ersten Rechenwerke und dann für alle folgenden Rechenautomaten als richtungwei1 Ein Google ist die Zahl 10100, nach MILTON SIROTTA, der den Namen 1938 erfand, siehe Wikipedia. Seite 1 von 12 send wählte und anpaßte. 2 Im Übrigen war man sich der rechnerischen Problematik in den Anfängen der Computerprogrammierung sehr wohl bewußt. Die im Computer verarbeitbaren Zahlen waren noch nicht so groß wie heute und man hatte stets die Gefahr einer „Division durch Null” im Auge. Es wurden auch schon sehr geistreiche Rechenkniffe, besser Programmierkniffe entwickelt, um dieser Gefahr auszuweichen. Da die heutigen Programmierer die angedeuteten Stolpersteine der Numerik oft nicht mehr ernst zu nehmen scheinen, soll mit diesem Aufsatz das dazu nötige Bewußtsein wieder geschärft werden. Grundlagen der Zahlenrechnung Seit der Mensch rechnet, benutzt er hilfsweise auch heute noch oft seine Finger, und sei es nur zum Zählen. Auch verschiedene Zahlensysteme sind seit Jahrtausenden bekannt. Daß man schon immer unterschiedliche Symbole verwendet hat, ist dabei für den Rechner eigentlich eine Nebensache, denn Rechen-Regeln sind von den Symbolen letztlich unabhängig. Unser heute allgemein gebräuchliches Zahlensystem hat zehn Ziffern, dargestellt durch die Symbole von 0 bis 9. Für anspruchsvolle Berechnungen übrigens weltweit; denn auch die Chinesen und Japaner und viele andere Völker mit eigenen Zahlensymbolen verwenden diese Ziffern, wenn sie überall gelesen und dabei verstanden werden wollen. Man hat sich stillschweigend auf sie geeinigt. Zugrunde liegt das indisch-arabische Dezimalsystem mit Ziffer „Null” und mit Stellenwertigkeit, heute kurz arabische Zahlen genannt. Im Abendländischen Kulturkreis haben sie sich gegenüber dem römischen System (übrigens auch ein Dezimalsystem) mit seinen Ziffern I, X, C, M, deren Halbwerten V, L, D und daraus gebildeten Zusammensetzungen, als brauchbarer erwiesen und durchgesetzt. Auch das weiß ein jeder, der mit römischen Zahlen gerechnet und nicht nur gezählt hat. Während der hinter uns liegenden Jahrtausende gab es als Unterstützung für das alltägliche Rechnen neben unseren Fingern und Zehen auch Steinchen, Perlen oder Knoten als Zählelemente. Seit etwa 1100 v. Chr. sind die als „Suanpan” oder „Soroban” in Ostasien gebräuchlichen Rechenhilfsmittel bekannt, mit denen schon umfangreichere Rechenarbeiten erledigt werden konnten. Ähnlich wie diese sind die „Stschoty” in Rußland noch heute weit verbreitet – Rechenkugeln, zumeist farbige, die auf horizontal übereinander angeordneten Metallstangen beim Rechnen hin und her geschoben werden, wobei diese Metallstangen in einem Rechteckrahmen stecken. 3 Wer z.B. in Odessa eine Fahrkarte kauft, sieht solche dort im Bahnhof an fast jeder Verkaufsstelle. Auch der Abakus gehört in diese Klasse. Für das Zehnersystem wurde bei Zahlen größer als 9 mit der nächsten Addition einer positiven Zahl > 0 (größer als 0) ein Stellenüberlauf eingeführt. Wir benötigen also schon beim einfachen Zählen zusätzliche Stellen, wenn wir mehr als 9 Gegenstände, sagen wir Einheiten, zusammenzählen oder aufaddieren wollen, darum Stellenwertigkeit. Die benötigten weitergehenden Rechenregeln hat der erste Rechenlehrer der Deutschen, ADAM RISE 1574 in seinem „Rechenbuch” zusammengestellt. 4 Er hatte das Zehnersystem im deutschsprachigen Raum zwar nicht eingeführt, aber allgemein bekannt gemacht. Es gab aber schon seit langer Zeit andere Zahlensysteme, solche mit mehr als 10 und auch mit weniger als 10 Ziffern. Zum Teil kannte man sie bereits vor dem Zehnersystem. Das Zwölfersystem oder Duodezimalsystem wird heute noch im angelsächsisch geprägten Kulturraum oft verwendet. Es ist nicht ganz „komplett”, weil es bei zwölf Zahlengrößen von Null bis Elf mit nur zehn Symbolen auskommen muß. Gleiches gilt für das in der Computertechnik 2 Zuse, K.: „Der Computer mein Lebenswerk”, Springer-Verlag, 3. Aufl. 1993. W. de Beauclair „Rechnen mit Maschinen”, Friedr. Vieweg & Sohn GmbH, Verlag, Braunschweig, 1968. 4 Adam Rise: „Rechenbuch”, Nachdruck der Ausg. v. 1574, © 1992 Edition »libri rari« im Verlag Th. Schäfer, Hannover. 3 Seite 2 von 12 benutzte Hexadezimalsystem mit seinen Zahlen Null bis Fünfzehn. Der Vorteil beim Zwölfersystem liegt im alltäglichen Gebrauch darin, daß man die Zahl Zwölf, bei der ein Stellenüberlauf stattfindet, durch die Zahlen 2, 3, 4, und 6 ohne Rest teilen kann (Teilung durch „1” ausgeschlossen) – beim Zehnersystem geht das nur mit den Zahlen 2 und 5. In der Mathematik verwendet man für die fehlenden Ziffern in den beiden vorgenannten Systemen Lateinische Großbuchstaben A, B, C, … Im Zwölfersystem also die Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, im Sechzehnersystem die Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Es ist zwar ungewöhnlich, wenn auch schwierig, jedoch möglich, mit beiden Systemen alle im Dezimalsystem gebräuchlichen arithmetischen Operationen auszuführen. Dieses gilt auch für Systeme mit weniger als zehn Ziffern, z.B. dem Oktalsystem, dem Quinärsystem, um nur die beiden zu nennen, die in der Computertechnik heute wieder eine bedeutende Rolle spielen. Eine Sonderstellung nimmt das Dual- oder Binärsystem ein. Man kann mit ihm nicht nur ebenfalls alle Rechenoperationen durchführen, die wir im Dezimalsystem verwenden, sondern zusätzlich Operationen der mathematischen Logik, man kann mit dem Binärsystem also mehr als mit dem Dezimalsystem. Dieses mehr hatte ZUSE erkannt und folgerichtig als Entwurfsgrundlage für seine Steuer- und Rechenwerke verwendet. Er konnte Arbeiten nutzen, die insbesondere GOTTFRIED WILHELM LEIBNIZ (1646 - 1716) schon veröffentlicht hatte. Leibniz nannte das Binärsystem das Dyadische System, welches heute dank ZUSE als Basis für die Schaltalgebra moderner Rechenautomaten verwendet wird. In seinen frühen Quellenstudien stieß ZUSE außerdem auf die Arbeiten von GEORGE BOOLE (1815 - 1864), dem Begründer des heute so genannten Aussagekalküls. Von den ganzen Zahlen zur halblogarithmischen Zahlendarstellung Wir wollen die folgenden Definitionen und Betrachtungen einschränken auf solche Zahlensysteme, die als Grundlagen der digitalen Informationsverarbeitung gelten. Beginnen wir mit den beiden Definitionen: 1) digitus m → Finger m, davon abgeleitet, Rechnen mit den Fingern als kleinster Recheneinheit. Man hat in frühen Zeiten zwar mit unterschiedlichen Fingerhaltungen und auch halben Fingern etc. gerechnet, dieses ist aber heute weitgehend unbekannt und soll deshalb nicht weiter betrachtet werden. 5 2) binär → „zweier Zustände fähig”. Damit wurde das binäre System die Grundlage des Rechnens mit den beiden Schaltzuständen „ein” und „aus”, der Aussagevariablen „ja” und „nein” und, wie heutzutage üblich, das Rechnen mit L und 0 . Bei den Zahlen werden wir unterscheiden zwischen den Definitionen, wie sie einerseits beim konventionellen Rechnen ohne Computer gelten: 5 Jacob Leupold: „Theatrum Arithmetico Geometricum”, Nachdruck der Ausg. v. 1727, Leipzig, herausgegeben 1982 von der Edition »libri rari« im Verlag Th. Schäfer, Hannover. Seite 3 von 12 3) natürliche Zahlen 4) ganze Zahlen 5) rationalen Zahlen 1, 2, 3, … , ohne Null, also wie man sie vorwiegend beim Zählen gebraucht, … -3, -2, -1, 0, 1, 2, 3, … … -3,5 -2,8 -1,1 0, 1,4 2,7 3,1 … und solchen, wie sie für Computer bezüglich Darstellung, interner Verarbeitung und Programmierung definiert sind. Zahlen in Computern: 6) ganze Zahlen wie unter 4), aber rationale Zahlen als 7) halblogarithmische Zahlen nach der Formel Y = b × 2a , (1) darin ist a als Exponent der Basis 2 der ganzzahlige Teil des Logarithmus von Y . In Computern wird bei der internen Rechnung also unterschieden zwischen ganzen Zahlen für das eigentliche Zählen, für Indizes und für das Rechnen in und mit BOOLE'schen Ausdrücken und halblogarithmischen Zahlen, bei denen wiederum unterschieden wird zwischen solchen, die über Drucker, Plotter oder Sichtschirm mit fest positioniertem Komma ausgegeben werden, genannt Festkomma- oder Festpunkt-Zahlen, Beispiel: ±3579.2468 Beispiel: ±0.3579246810+04 , oder Gleitkomma- oder Gleitpunkt-Zahlen, auch geschrieben ±0.35792468E+04 . Um endlich zum Kern der Frage zu gelangen, wie sich denn die maschineninternen Genauigkeits- und Gültigkeitsbereichs-Grenzen der vorbeschriebenen Zahlen ergeben, müssen wir uns mit der internen Abbildung und Speicherung im Computer befassen. Wir verwenden dafür eine Modell-Zelle in einer Gliederung, wie sie von ZUSE in seinen Rechenanlagen ab dem Typ Z11, also nach ungefähr 1955, benutzt wurde, allerdings mit mehr Bits (binary digits) als wir sie jetzt benötigen. Diese Zellenaufteilung wurde inzwischen in praktisch alle modernen Computer und Prozessoren übernommen, mit nur unbedeutenden Abweichungen, und gelten heute noch. Seite 4 von 12 Danach gibt es vier Zellinhaltstypen, hier mit 12 Bits als Modell-Zelle Positive ganze Zahlen: 0 0 0 z.B. 0 0 VZ. L L 64 32 99 0 größte positive ganze Zahlen hier: 0 0 VZ. L L (512) 256 0 0 L L 2 1 1023 L L L L L L L L 128 64 32 16 8 4 2 1 Bei positiven ganzen Zahlen geben hier zwei Bits das Vorzeichen der Zahlen an, also das Pluszeichen, dargestellt durch die beiden links angeordneten, grau unterlegten Felder – man könnte dafür grundsätzlich andere Felder wählen, wie es bei einigen Computerfabrikaten auch gemacht wird. Somit verbleiben bei unserer Modell-Zelle 10 Bits für die eigentliche Darstellung des Zahlenbetrages. Bei der Zahl „Null” sind alle Bits mit 0 belegt. Negative ganze Zahlen: L „Flüchtige Eins“ L L L z.B. L L L -14 L L VZ. größte negative ganze Zahlen hier: L VZ. L 0 0 (512) 256 0 0 8 4 L 0 1 -1024 0 0 0 0 0 0 0 0 128 64 32 16 8 4 2 1 Negative Zahlen haben in beiden Vorzeichenfeldern die binäre „Eins” L , die Zahlenbeträge werden als ihre Komplementwerte eingesetzt. Zur Veranschaulichung stelle man sich vor, es seien alle 12 Bitfelder mit 0 besetzt (einschl. Vorzeichen) und am linken Ende die sog. flüchtige Eins vorangestellt 6 , siehe oben, dann ergäbe das L000000000000 (bitte nachzählen). Davon würde der Betrag „Eins”, also L abgezogen, das würde dann die komplementäre Eins ergeben, nämlich LLLLLLLLLLLL . Darin sind die beiden Vorzeichen-Bits LL am linken Ende automatisch enthalten. Noch einmal: „flüchtige Eins” – VZ Betrag L|00|0000000000 L |LL|LLLLLLLLLL 0 - 1 -1 Man versuche dasselbe mit anderen negativen ganzen Zahlen. Bisher können wir ganze Zahlen im Bereich von – 1024 bis + 1023 verwenden, d.h. darstellen und errechnen. Zahlen, die im Laufe einer Berechnung größer als 1023 werden, passen nicht mehr in unsere Modell-Zelle, sie erzeugen eine „Bereichsüberschreitung”. 6 … „flüchtige Eins” darum genannt, weil sie nur geschaltet, nicht aber gespeichert wird. Seite 5 von 12 Wollen wir rationale Zahlen erzeugen, dann brauchen wir die halblogarithmische Darstellung, in etwa so, wie sie der junge KONRAD ZUSE vorgeschlagen und eingeführt hat. Wir verwenden die grundlegende Formel (1), siehe oben. Darin bestimmt der Exponent a die Größenordnung der Zahl Y , der Faktor b heißt Mantisse und bestimmt Zahlenwert und Genauigkeit von Y . 0 0 L 0 L 0 L 0 L b VZ. Mantisse 0,5 0,125 0,25 0,03125 0,0625 0,015625 0 0 0 a Exponent Σ = 0,65625 Die Vorzeichenstellen gelten wie vorher. Die Belegung der Mantisse ist wie folgt definiert: Die linke Stelle ist 0,5, also 1 2 . Dann folgt rechts daneben davon die Hälfte, also 1 4 . Nach rechts fortschreitend davon wieder die Hälfte = 1 8 und so weiter, also 1 16 , 1 32 und 1 64 . Auch bei größeren Mantissen wird immer fortschreitend halbiert. Die Anzahl der Stellen hinter dem Komma wird dabei automatisch immer größer, die absoluten Beträge aber immer kleiner. In der vorigen Abbildung sind die Werte als Dezimalbrüche eingetragen, man erkennt die wachsende Stellenzahl. In der Mantisse werden jetzt alle die Brüche addiert, deren zugehöriges Zellenbit mit L belegt ist, im obigen Bild fett kursiv gedruckt; die Summe ist rechts daneben angegeben. Damit ist b bestimmt. Nun folgt die Multiplikation mit dem Exponenten a , genauer, mit der Zweierpotenz. Die Basis 2 ist im Rechenwerk fest „verdrahtet”, wie es bei Zuse-Anlagen hieß 7 . In den Zellenbits steht nur L oder 0, je nachdem welche Zweierpotenz gerade gilt. Um ein Extrabit für das Vorzeichen des Exponenten zu sparen, wird eine Art Bezugsverschiebung vorgenommen. Danach gilt als Definition des Exponentenbereiches: − 8 ≤ aˆ < +7 bei a = 8 + aˆ . Deshalb ist das Exponentenbit ganz links in der Grundbelegung mit L besetzt, das ergibt die binäre 8 = L000. Würde man bei 4 Bits wie hier eines für das Vorzeichen des Exponenten verwenden, dann hätte man nur drei übrig für die Zweierpotenzen. Das erscheint heutzutage knauserig, führte aber zu Zeiten teurer Magnetkernspeicherplätze zu spürbarer Reduzierung der Herstellungskosten. Heute macht man so etwas natürlich nicht mehr. – Rechnet man die Inhalte des vorigen Zellenbeispiels zuende, das ergibt das als rationale Zahl 0,65625 × 2 0 = 0,65625 × 1 also 0,65625. Hier muß jetzt auf eine Besonderheit hingewiesen werden. Der kritische Leser wird gemerkt haben, daß bisher nicht zwischen ganzen und halblogarithmischen Zahlen unterschieden werden kann. Um dies zu ermöglichen, ist festgelegt, daß das dritte Bit von links bei halblogarithmischen Zahlen immer mit L, also dem Dezimalbruch 0,5 besetzt ist, bei ganzen Zahlen dagegen mit 0. Darum müssen wir jetzt das erste Beispiel mit unserer 12-Bit-ModellZelle korrigieren: dort muß das dritte Bit von links immer eine 0 sein, daran wird der Inhalt nämlich als ganzzahlig erkannt. Deshalb kann dieses Bit nicht mitgezählt werden und für die Zahlendarstellung geht es verloren. Die größte positive ganze Zahl ist also 511 (nicht 1023) und die vom Betrage her größte negative Zahl 512 (nicht 1024). Darum sind in den ersten vier Zellenbeispielen die Werte 512 auch in Klammern gesetzt. 7 In neueren, vor allem großen Computern sind statt 2 oft auch die Basis 4, 8, oder 16 fest gespeichert. Das macht allerdings nur Sinn, wenn gleichzeitig sehr viele Mantissenstellen vorgesehen sind. Seite 6 von 12 Man versteht nun leicht die nächsten drei Beispiele. 0 0 Dieses ist die +1,0: L 0 0 0 0 0 L 0 0 0,5 L 1 Hier die in einer 12-Bit-Zelle überhaupt darstellbare größte , positive rationale Zahl: 0 0 L L L L L L L L L L 0,984375 × 128 = + 126 Und schließlich die in einer 12-Bit-Zelle darstellbare kleinste, positive rationale Zahl: 0 0 L 0 0 0 0 0 0 0 b VZ. 0 a × 0,5 0,25 0,125 0,5 1 = 256 512 = 0 1 256 0,0625 0,015625 0,03125 0,001953125 . Hat man sich mit den vorstehenden Ausführungen vertraut gemacht, dann versteht man sehr schnell die Vorteile für das praktische Rechnen. Zur weiteren Veranschaulichung soll uns ein Zahlenstrahl dienen. Wir verwenden den positiven Ast und deuten den negativen nur an, für ihn gilt letztlich das gleiche. Der abgedeckte Mantissenbereich b ist nach Addieren aller Inkremente: + − 0 0,5 1,0 2,0 3,0 0,5 + 0,25 + 0,125 + 0,0625 + 0,03125 + 0,015625, das ist mit a = 20 = 1: 0,984375, 4,0 (siehe oben). also um 0,015625 < 1,0. 1 Mit a = 2 , also dem Faktor 2 des obigen Mantissenbereichs, gilt dann folgender Bereich: also um 0,03125 < 2,0. Mit a = 22 , also dem Faktor 4 des obigen Mantissenbereichs, gilt untenstehender Bereich: also um 0,0625 < 4,0 , und so weiter. Man sieht, je weiter sich der betrachtete Zahlenbereich vom Zahlenursprung entfernt, desto größer wird derselbe, desto größer wird aber auch die Ungenauigkeit. Verwenden wir aller- Seite 7 von 12 dings negative Exponenten der Basis 2, also den Faktor a = 2-1 , was ist = 0.5, dann tritt das Gegenteil ein, siehe nachfolgend die verlängerte vorige Zeichnung. Die Bereiche werden kleiner, aber die Genauigkeit nimmt zu. Es gibt auch kein Problem, wenn schließlich die „Null” erreicht wird, wie früher schon beschrieben wurde. Gelangen wir schließlich zur kleinsten darstellbaren Zahl, die wir schon berechnet hatten, nämlich 0,001953125, und ziehen noch ein Bit ab, dann muß am Ende auch das Bit verschwinden, welches in unserer Modell-Zelle, an der dritten Stelle von links, bisher den Mantissenwert 0,5 hatte und außerdem als Unterscheidungsbit genutzt wurde. Wir erhalten automatisch die „Null”, die logischerweise für ganze Zahlen ebenso wie für rationale Zahlen gilt. Daß das soeben Erläuterte auch ohne Einschränkung gilt, wenn wir negative Zahlen haben, also wenn wir uns auf dem Zahlenstrahl von links auf den Zahlenursprung zu bewegen, wurde schon gesagt. Die Formel (1) wird deshalb ergänzt zu Y = ± | b × 2a | . Verlassen wir nun unsere Modell-Zellen und betrachten solche, wie sie ab 1960 in den ersten transistorisierten Anlagen der ZUSE KG vom Typ Z 23 verwendet wurden. Diese hatten Kernspeicher- und Trommelzellen mit einer sog. Wortlänge von je 40 Bits. Was bisher über die Darstellung von ganzen und halblogarithmischen Zahlen gesagt worden ist, gilt weiterhin uneingeschränkt, nur die jeweilige Anzahl der Bits ist größer. Bei ganzen Zahlen gibt es zwei Vorzeichenbits und das eine Bit für die Unterscheidung ganzer und halblogarithmischer Zahlen, verbleiben also 37 Bits für die eigentlichen Zahlen. Diese können somit dargestellt werden im Bereich −237 ≤ X < +237 . Ausgeschrieben ist das −137.438.953.472 ≤ X ≤ 137.438.953.471 . Bei halblogarithmischen Zahlen gilt: 2 Vorzeichenstellen, 30 Mantissenstellen, Dieses entspricht einem Zahlenbereich von 8 Exponent-Stellen. 0,210-38 ≤ Y ≤ 0,13421772710+39 . Man mache sich klar, das sind 0,000000000000000000000000000000000000002 als kleinste Zahl und 134217727000000000000000000000000000000,0 als größte Zahl, heute meistens geschrieben: 0,2E–38 ≤ Y ≤ 0,134217727E+39 . Wie wirkt sich dieses aus, wenn in einer Berechnung auf den Betrag einer sehr großen Zahl eine sehr kleine Zahl addiert wird? Beispielsweise wenn auf eine astronomische Entfernung von einem Lichtjahr = 9,4339623 × 1015 m, eine Länge von 500 m hinzugezählt wird? Dann ist das in ausgeschriebener Darstellung: 9.433.962.300.000.000 + 500 = 9.433.962.300.000.500 m. Kein Astronom wird diese 500 m berücksichtigen. Sie liegen weit unterhalb der normalerweise in der Astronomie interessierenden, womöglich nicht einmal erzielbaren Genauigkeit der Messungen. Also werden die letzen Stellen mit Sicherheit gerundet, wobei die 500 m wegfallen. Dieses ergibt sich bei den arithmetischen Operationen halblogarithmischer Zahlen nach ZUSE automatisch. Aber, wie wir gerade festgestellt haben, spielt das bei den Computern vom Typ ZUSE Z23 noch keine Rolle, in Ihnen würde ein solcher Fall noch in allen Stellen zu Seite 8 von 12 korrekten Ergebnissen führen. Bei Computern sieht man aber auch heute für den normalen Ergebnisausdruck eine so große Stellenzahl gar nicht vor. Im Normalfall werden 9 Dezimalstellen gedruckt bzw. auf dem Sichtschirm angezeigt. Eine weitere wird nur für Rundungen mitgeführt, aber nicht mehr ausgegeben. Zeigen wir noch die Gültigkeitsbereiche in heutigen Computern: 0,2E–334 ≤ Y ≤ 0,134217727E+335 . Bei Taschenrechnern und Uhren verwendet man einen als Massenprodukt in Ostasien hergestellten Chip, für das auch die Berechnung des Kalenders, des Datums und der Uhrzeit möglich ist. Darin gilt wie oben schon erwähnt der Bereich: ≈ 0,1E–99 ≤ Y ≤ ≈ 0,1E+99 . Für Sonderanwendungen, z.B. bei astronomischen Berechnungen, wo es auf sehr große Zahlenbereiche (Entfernungen) ankommt, hatte man schon früh in großen Rechenanlagen die Möglichkeit, die Anzahl der Bits im Exponentenbereich auf Kosten der Mantissen-Bits zu vergrößern. Auch bei ZUSE-Rechenanlagen ab dem Typ Z 22 war es möglich (hier dargestellt für eine 40 Bit-Zelle der Z 23) den Exponenten zu vergrößern, ebenfalls auf Kosten der Mantissenlänge. Normalerweise ging dieses durch Koppelung zweier Zellen zu einer mit dann 80 Bits. Fest vorgesehen von der ZUSE KG, nämlich durch Eingeben eines speziellen Betriebsprogramms, waren folgende zwei Aufteilungen der gekoppelten Zellen möglich: 2 Mantisse 30 Exp. 8 2 30 8 Bits zu a) 2 Mantisse 38 Exp. 40 Bits für größere Zahlen bei gleichbleibender Genauigkeit, b) 2 Mantisse 70 Exp. 8 Bits für Zahlen in dem normalen Bereich, aber mit extrem hoher Genauigkeit. Der Autor hatte 1963 ein Unterprogramm für die Zuse Z 22 R entwickelt, mit dem die Mantissen- und Exponentenbereiche beliebig gegeneinander verteilt werden konnten, also auch folgendes möglich war: 2 Mantisse zw. 30 und 70 Exp. zw. 8 und 40 Bits. Bekanntlich hat man schon früh eine Zusammenfassung von 8 Bits zu einem Byte vorgenommen. Die Fa. IBM hat dieses um 1966 mit ihrem Extended Binary Coded Decimal Inter- Seite 9 von 12 change-Code eingeführt (EBCDIC). Dieses war der erste echte 8 Bit Code (sein Prüfbit war ein neuntes) zurzeit, als der IBM Code als Firmennorm zur Bezeichnung Byte führte. Heute steht dafür auch ASCII (American Standard Code for Information Interchange). Das Byte ist damit die kleinste Einheit zur binären Abbildung eines alphanumerischen Zeichens von insgesamt 256 Zeichen aus der Menge des ASCII 8 . In heutigen Computern sind die Speicherzellengrößen gegliedert in Vielfachem des Bytes. 1. 0,5 Byte ( 4 Bit) Ausnahme in schnellen Prozeßrechnern, 2. 1 Byte ( 8 Bit) 3. 2 Byte (16 Bit) 4. 3 Byte (24 Bit) in älteren Computern (vor 1985), 5. 4 Byte (32 Bit) 1 Wort, in modernen sog. 32-Bit-Rechnern, 6. 6 Byte (48 Bit) 7. 8 Byte (64 Bit) 2 Worte. Alle sind adressierbar, also jeweils über eine eigene Adress-Nr. erreichbar. Hier sei angemerkt, daß die Gliederung bzw. Aufteilung der Zellen-Inhalte in Vorzeichenbereich, Mantissen- und Exponentenbereich i.d.R. nicht mehr wie bei ZUSE-Rechnern organisiert ist. Dieses hat aber nur in Ausnahmefällen Einfluß auf die Zahlendarstellung bzw. verarbeitung (beim Schiften zur Bildung von Mehrfachworten). Wir wollen hier nicht näher darauf eingehen. Nur der Vollständigkeit halber sei jetzt noch erwähnt, daß in den gleichen Zellen bei ZUSERechnern, und natürlich auch den meisten Rechnern anderer Fabrikate, Befehle (Anweisungen, statements oder instructions) und Texte untergebracht werden können. Um diese von Zahlen unterscheiden zu können, werden die beiden ersten Bits von links benutzt nach folgender Regel: L 0 Kennzeichen für Befehl, 0 L Kennzeichen für Text. VZ. Folgerungen In Rechenprogrammen gibt es, korrekt gesagt, keine mathematischen Gleichungen, sondern nur Zuweisungen. Darauf hat ZUSE schon sehr früh hingewiesen. Von ihm stammt die Notation: 5 + 7 ⇒ 12, (heißt, ergibt 12) bzw. 12 ⇐ 5+7, (heißt, ergibt sich aus 5+7). Der Programmierer kann und muß direkt Einfluß auf die Abfolge einzelner Operationen innerhalb eines Programmbefehls, genauer gesagt, innerhalb einer Rechenanweisung nehmen. Dieses ist von entscheidender Bedeutung zur Verhinderung von unzulässigen Überschreitungen maximal zulässiger Zahlengrößen in Ergebnissen, auch in Zwischenergebnissen, und zwar nicht nur dann, wenn sie in Computerzellen abgespeichert werden sollen. Wenn die am Anfang in der Zusammenfassung und der Einleitung dieses Beitrages angedeuteten numerischen Schwierigkeiten in einem Programmlauf eintreten, dann liegt das in so gut 8 H. Zemanek: "Alphabets and Codes 1967 für Information Processing". R. Oldenbourg Verlag München und Wien, 1967 (engl. u. deutsch). Seite 10 von 12 wie allen Fällen daran, daß irgend eine Zahl innerhalb der Berechnung die von der zuständigen Speicherzelle aufnehmbare Größe überschritten hat. Dieses kann beim Summieren und Multiplizieren geschehen (was selten vorkommt). Es kann auch beim Dividieren passieren (was meistens der Fall ist), nämlich immer dann, wenn eine sehr große durch eine sehr kleine Zahl geteilt wird. Es muß gar nicht immer gleich eine Division durch Null versucht worden sein, die ja bekanntlich zu dem unbestimmten Wert ∞ führt und deshalb numerisch nicht geht. Vielleicht wird der Leser dieses für eine Trivialität halten. Sie ist es eigentlich auch. Das ändert jedoch nichts daran, daß die soeben angedeuteten Fälle immer wieder auftreten, besonders natürlich bei komplizierten Formeln, bei deren Abwicklung man die einzelnen Zwischenstadien der Berechnung mit ihren Größenordnungen nicht leicht überschauen kann. Bei seiner Doktordissertation wollte ein Kandidat nach einem Vierteljahr in heller Verzweiflung aufgeben. Das im Rahmen seiner Arbeit von ihm selbst geschriebene Programm hatte formal keine Fehler, blieb aber an einer bestimmten Stelle immer mit der gleichen gefürchteten overflow-Meldung stehen, auch bei großen Speicherwortlängen. Von den Ergebnissen hing der Erfolg der Promotion ab. Die neuralgische Anweisung war genau lokalisiert, nichts war falsch. Alle einzelnen in der betreffenden Anweisung zu berechnenden Werte hatten die speicherbare Größenordnung nicht überschritten. Was war die Ursache? Es war nur übersehen worden, dass zwei Faktoren zur gleichen Zeit ihre Größtwerte annahmen. Deren Multiplikation führte dadurch zur Bereichsüberschreitung. Mit einer einfachen Umstellung konnte das Problem gelöst werden. – Das Umstellen des Programms in einen Doppelwort-Modus, z.B. vom 32- auf 64-Bit-Wort, hätte das Problem übrigens auch nicht nachhaltig behoben, der Overflow wäre einige Schleifenzyklen später eingetreten. Eine wichtige Regel sollte man sich für vergleichbare Fälle einprägen. Danach sollte grundsätzlich nie so gerechnet werden: (a × b × c × d) / (e × f × g × h) ⇒ Resultat, sondern so: a / e × b / f × c / g × d / h ⇒ Resultat. Allerdings hängt dieses auch davon ab, ob nicht ausgerechnet die Faktoren e, f, g, h zur gleichen Zeit sehr klein sind. Sicher ist das Problem jetzt auch für den Leser erkennbar. Entscheidend ist, daß man beim Programmieren arithmetischer Ausdrücke immer im Auge behält, ob und wann Bereichsüberschreitungen auftreten können und wie man sie mit Fallentscheidungen bzw. bedingten Anweisungen, oder durch einfache Umstellung der einzelnen Zwischenoperationen, abfangen kann. Leider gibt es wohl noch keinen Compiler oder Interpreter (im Jahre 2000), welcher automatisch eine Doppelwort-Arithmetik einschaltet und, wenn dieses nicht ausreicht, ebenfalls automatisch vor dem Overflow warnt, wenn die Werteentwicklung sich der Aufnahmegrenze der Speicherzellen nähert. Es gibt auch noch keine Möglichkeit, das Programm mittels eines dafür geschaffenen Befehls automatisch in einem Bruch kürzen zu lassen. Formal wäre so etwas möglich. Bei der Lösung großer Gleichungssysteme kann leicht der Fall der berüchtigten kleinen Differenzen großer Zahlen eintreten. Auch hierbei ist das Einschätzen der Werteentwicklung keineswegs trivial. Das Optimum stellen Verfahren dar, die aufgrund ihres Formelaufbaus die vorbeschriebenen Probleme in digitalen Rechenautomaten, also in Computern, gar nicht erst auftreten lassen. Sie haben sich in der Praxis bewährt und sollten in unserem weiteren Verständnis die eigentlichen Digitalen Methoden sein. Seite 11 von 12 Kein Geringerer als CARL FRIEDRICH GAUSS strebte als genialer Rechenmeister bei seinen Berechungen genau solche Methoden an und benutzte z.B. für seine „Methode der kleinsten Quadrate“ den Begriff „ … geschmeidiger, für die wirkliche Anwendung geformter Calcul“ 9 . 9 Carl Friedrich Gauß. Werke, Band VI, S.54 Seite 12 von 12