Skip to main content

Zahlendarstellungen

  • Chapter
  • First Online:
Das C++ Kompendium

Part of the book series: eXamen.press ((EXAMEN))

  • 6281 Accesses

Zusammenfassung

Das Thema des letzten Kapitels – ASN.1–kodierte Datenströme – wird meist in Verbindung mit „gesicherter“ Datenübertragung benötigt, wobei mit „gesichert“ nicht nur „verschlüsselt“ gemeint ist. Die Sicherung von Daten ist in vielen Fällen mit der Handhabung großer ganzer Zahlen verbunden, wobei „groß“ für „nicht systemunterstützt“ steht.1 Grund genug, sich einmal mit der Software für solche Zahlen zu beschäftigen. Da neben den ganzen Zahlen in der Technik die reellen Zahlen (die komplexen Zahlen betrachte ich mal als Ableger der reellen, obwohl das technisch natürlich nicht ganz so trivial ist) eine noch größere Rolle spielen, nehmen wir diese beziehungsweise ihre Pendants auf den Rechnern gleich mit in unsere Betrachtungen auf.

This is a preview of subscription content, log in via an institution to check access.

Access this chapter

Chapter
USD 29.95
Price excludes VAT (USA)
  • Available as PDF
  • Read on any device
  • Instant download
  • Own it forever
eBook
USD 39.99
Price excludes VAT (USA)
  • Available as EPUB and PDF
  • Read on any device
  • Instant download
  • Own it forever
Softcover Book
USD 39.99
Price excludes VAT (USA)
  • Compact, lightweight edition
  • Dispatched in 3 to 5 business days
  • Free shipping worldwide - see info

Tax calculation will be finalised at checkout

Purchases are for personal use only

Institutional subscriptions

Notes

  1. 1.

    Einige Java–Spezies werden an dieser Stelle möglicherweise widersprechen, da Java doch Zahlen beliebiger Länge bereitstellt (was dann obendrein noch als Argument verwendet wird, Java als die technisch einzig sinnvolle Sprache darzustellen, da nur sie alles beinhaltet). Dem kann ich zwei Sachen entgegenhalten: (A) Eine sehr große Zahl von derzeitigen und zukünftigen Bibliotheksfunktionen existiert nur, weil einige der verspotteten „Dummköpfe“ die entsprechenden Anwendungen in C oder etwas ähnlichem programmiert und in das Java–System eingebunden haben. (B) Wie ich in den letzten Kapiteln zeigen werde, sind viele Rechenergebnisse unbrauchbar, wenn der Anwender die Technik einfach nur nutzt, ohne ihre Eigenschaften zu verstehen. Gerade da muss man einigen Java–Argumentatoren entgegenhalten, dass sie nicht verstanden haben, worum es eigentlich geht. In dem Sinne werden Sie das Rechnen mit Zahlen nach den nächsten beiden Kapiteln vermutlich etwas anders betrachten.

  2. 2.

    In den meisten Fällen wird vermutlich eine PC-ähnliche Maschine mit einem Intel-Pentium-Prozessor oder einem kompatiblen Prozessor zum Einsatz kommen, was die Auswahl natürlich einschränkt. Andere Maschinen mit RISC-Prozessoren sind unter Umständen anders anzufassen.

  3. 3.

    Das kann beispielsweise schon eine weiterentwickelte Version eines getesteten System sein.

  4. 4.

    In diesem Zusammenhang werden dem Leser sicher auch die „Test suites“ hochperformanter Bibliotheken in den Sinn kommen, die nach Erstellen der Systembibliothek Tests gegen bekannte Ergebnisse fahren. Kommt nicht das Erwartete heraus, so sind entweder Assembler-Routinen in der Umgebung nicht brauchbar oder, noch schlimmer, die verwendeten „Sprachstandarts“ gelten auf der untersuchten Maschine nicht.

  5. 5.

    Diese Bemerkung trifft nicht auf C-Implementationen zu, die immer die notwendige Freiheit gewähren. In Pascal oder Fortran ist das jedoch nicht unbedingt so, da die Sprachsyntax weiter von der Maschinenebene entfernt ist als die von C und Überlaufsicherungen einschließt.

  6. 6.

    Im weiteren Fallen kaum konkrete Aufgaben an, da ansonsten meiner Meinung nach die Diskussion doch zu sehr zerrissen wird. Arbeiten Sie den Code deshalb bitte ohne ausdrückliche Aufforderung parallel zur Theorie/zu den Beispielen auf.

  7. 7.

    Man kann natürlich immer mit der Breite ulong arbeiten und gegebenenfalls einige Nullbytes am Zahlenende in Kauf nehmen. Die byteweise Vorgehensweise hängt mit den Algorithmen für die Multiplikation zusammen.

  8. 8.

    Auch die Darstellung in den gebräuchlichen 3er-Schritten ist sinnlos, da hierfür keine Begriffe wie „super-Mega-Giga-Protz-...“ vorhanden sind. Zum Abzählen sind dann 5er- oder 10er-Unterteilungen sinnvoller.

  9. 9.

    Häufig schrecken Leute vor komplexen Zahlen zuück wie der Teufel vor dem Weihwasser. Machen Sie sich aber einfach einmal klar, dass komplexe Zahlen wie rationale Zahlen einfach nur aus zwei Komponenten bestehen. Außer den anderen Rechenvorschriften sind sie also nicht komplizierter als rationale Zahlen.

  10. 10.

    Die Stützstellen (15.3) sind ja nichts anderes als die N-ten komplexen Einheitswurzeln, wie man sich leicht überzeugt.

  11. 11.

    Für den Nachweis kann man wie in (15.6) vorgehen und bei festgehaltenem Index i nur über k summieren. Der dabei auftretende Doppelindex ij wird aufgrund der Zyklizität eindeutig auf einen anderen Index abgebildet, so dass man letztendlich \(\sum {\omega _i^j } \omega _k^l = c * \delta _{i,k} \delta _{j,l} \) erhält.

  12. 12.

    Wegen N=2^n sind die Werte immer ganzahlig.

  13. 13.

    Die Vergrößerung des Rechenpuffers verändert natürlich die Aufwandsabschätzungen etwas und die Verdopplung der Puffergröße führt zu deutlichen Sprüngen in der Ausführungszeit. Es existiert auch eine Version des FFT–Algorithmus, die die Verdopplung der Puffergröße und damit die Sprünge vermeidet; wir gehen hierauf jedoch nicht weiter ein.

  14. 14.

    Die Implementation von komplexen Zahlen kann schon fast als „Fingerübung“ betrachtet werden. In der C++ – Standardbibliothek ist ebenfalls eine Vorlagenklasse vorhanden, auf die auch zurückgegriffen werden kann.

  15. 15.

    Auch das führt natürlich dazu, dass die Multiplikation mittels der Fouriertransformation nicht ganz so schnell zur klassischen oder Karatsuba–Multiplikation aufschließt.

  16. 16.

    Kurzerläuterung: „Ringe“ sind algebraische Gebilde, in denen Addition, Subtraktion und Multiplikation vollständig erklärt sind, die Division aber nicht immer lösbar ist. In „Körpern“ ist auch die Divisionsaufgabe eindeutig lösbar. Als Beispiel betrachte man die Aufgabe 5/2. In \({\mathbb Z}\) findet man keinen Faktor, der mit 2 multipliziert 5 ergibt, in \({\mathbb R}\) ist der Faktor durch 2,5 wohldefiniert.

  17. 17.

    Wurzeln lassen sich auf unendliche periodische Kettenbrüche zurückführen. Kettenbrüche lassen sich daher auch zur optimalen Approximation von Wurzeln einsetzen.

  18. 18.

    Das ist kein Schreibfehler: Die Zahlen werden mittels des Exponenten immer so normiert, dass das höchste Bit=1 ist. Wenn man das weiss, braucht man dieses Bit aber nicht mehr zu speichern. Auf diesen Trick ist man auch bei der Definition des Typs double gekommen, so dass auf 64 Bit insgesamt 65 Bit dargestellt werden..

  19. 19.

    Das ist nicht unbedingt notwendig. Es kann auch mit der Bitanzahl gearbeitet werden, die jeweils gültig definiert ist. Ob die Verkürzung zu besseren Laufzeiten führt, hängt davon ab, welcher Anteil von Zahlen in einer längeren Rechnung tatsächlich weniger gültige Bits als die maximale Anzahl aufweisen. Voraussichtlich reicht das meist nicht, aber wenn Sie gegenteilige Meinung sind, müssen Sie in den Algorithmen entsprechende Anpassungen vornehmen.

  20. 20.

    Man kann natürlich auch mehr als ein Bit pro Durchlauf anfordern, muss dann aber kontrollieren, wie viele tatsächlich ankommen. Bei genauer Kenntnis der Maschinenimplementation ist natürlich auch ein direkte möglich, aber dann für jeden Maschinentyp getrennt.

  21. 21.

    Sofern es sich um iterative Algorithmen wie beispielsweise die Berechnung einer Wurzel handelt, können die maschinengenauen Daten als Startwerte für die Iteration verwendet werden. Die Iterationen sind dann nach wenigen Schritten zu Ende.

  22. 22.

    Man hätte natürlich auch die Inhalte kopieren können und dafür ein innenstrukturiertes Feld (Feld mit Doppelindex) verwenden können, müsste dann aber auch die interne Indizierung bei der auswahl der Algorithmen beachten. Mit dem Doppelzeigersystem erledigt sich diese Problem, und aufgrund des Aufbaus der Algorithmen entsteht auch kein Mehraufwand gegenüber einer Indexberechnung.

Author information

Authors and Affiliations

Authors

Corresponding author

Correspondence to Gilbert Brands .

Rights and permissions

Reprints and permissions

Copyright information

© 2010 Springer-Verlag Berlin Heidelberg

About this chapter

Cite this chapter

Brands, G. (2010). Zahlendarstellungen. In: Das C++ Kompendium. eXamen.press. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-642-04787-9_15

Download citation

Publish with us

Policies and ethics