Ich weiß also über die Präzision von Gleitkommazahlen Bescheid (und darüber, wie Dinge wie 1,1 nicht genau im Binärsystem ausgedrückt werden können) und all das, aber ich frage mich: wie implementieren mathematische Bibliotheken dann die unendliche Präzision? Mit anderen Worten, wie würden Sie beispielsweise 1,1 genau im Binärsystem darstellen? Eine kurze Beschreibung wäre toll, ich kann die genauen Details selbst herausfinden. Danke. :)
Antworten
Zu viele Anzeigen?Es gibt keine Bibliotheken für unendliche Genauigkeit, aber es gibt Bibliotheken für beliebige Genauigkeit. Für Details zur Implementierung dieser, lesen Sie einige Dokumentation :-)
Um 1,1 genau binär darzustellen, kann Gleitkommazahl wie von Ihnen richtig bemerkt nicht verwendet werden. Es kann dargestellt werden, wenn Sie den ganzzahligen Teil (1) als eine Ganzzahl speichern und den Bruchteil (.1) als eine weitere Ganzzahl, und dann müssen Sie die Logik erstellen, um mit diesen Strukturen umzugehen. Alternativ könnte es als Bruch (11/10) gespeichert werden, wobei sowohl der Nenner als auch der Zähler als Ganzzahlen gespeichert sind.
Wenn Sie wirklich unendliche Genauigkeit meinen, gibt es zwei Möglichkeiten:
-
Verwenden Sie eine Form von Lazy Computation. Dann können Sie eine Nummer nach beliebig viel Genauigkeit fragen "nach" der Ausführung der Berechnung (da sie faul ist, wird sie erst dann tatsächlich ausgeführt). Der Nachteil dabei ist, dass dies sehr ineffizient ist. Sie können dies in einer Sprache wie Haskell tun, die ein spezielles Zahlensystem verwendet, bei dem die Darstellungen überlappen, z.B. Basis 2 mit den Ziffern -1, 0, 1. Die übliche Darstellung ist ungeeignet, da Sie z.B. bei 1 unendliche Genauigkeit benötigen, um zwischen der Ausgabe von 0 für 0,999... und 1 für 1,000... zu entscheiden.
-
Führen Sie die Berechnung symbolisch durch. Stellen Sie Ganzzahlen, rationale Zahlen, Wurzeln usw. genau dar. Dies ist erforderlich, wenn Sie Gleichheit feststellen möchten, aber auch eher ineffizient und auf spezielle Fälle beschränkt.
Mathematische Bibliotheken mit unendlicher Präzision sind nicht implementiert. Es kann nicht gemacht werden. Die Zahl 1/3 kann außer als Bruch nicht durch eine endliche Anzahl von Bits dargestellt werden. Transzendente Zahlen wie pi und e können in keiner Weise vollständig dargestellt werden.
Andererseits ist es möglich, mathematische Bibliotheken mit riesiger Präzision zu erstellen. Es kommt alles darauf an, genügend Bits für die Mantisse des Gleitkomma-Werts zuzuweisen.
Es gibt bestimmte geometrische Algorithmen, die von der genauen Arithmetik abhängen. Wenn Sie in der CGAL-Bibliothek nachsehen, finden Sie eine Vielzahl von exakten numerischen Typen, die unter verschiedenen Operationen "abgeschlossen" sind. Das heißt, es gibt keine Möglichkeit, die unterstützten Operationen zu verwenden, um ein Ergebnis zu erzeugen, das nicht genau dargestellt werden kann.
Einige Beispiele:
-
Ganze Zahlen sind abgeschlossen unter Addition und Multiplikation.
-
Rationale Zahlen sind auch abgeschlossen unter Division, mit einer Ausnahme für den Spezialfall von Null. Können als Paar von ganzen Zahlen dargestellt werden. Siehe auch die rationalen Zahlenfunktionen in GMP. z.B. 1,1 = 11/10, kann als (11, 10) dargestellt werden.
-
Ein Zahlen-Typ, der auch unter der Quadratwurzel abgeschlossen ist.
Sie könnten Zahlen auch im Dezimalsystem darstellen und Dezimalrechnungen durchführen. Die zugrunde liegende Darstellung ist binär, in dem Sinne, dass jede Ziffer mit einem binären Code dargestellt wird. Jede Ziffer - egal ob links oder rechts vom Dezimalpunkt - wird als Ganzzahl behandelt. Die Arithmetik wird dann "manuell", Ziffer für Ziffer durchgeführt.
Ein Beispiel für eine dezimalbasierte Bibliothek ist BCMath in PHP.
- See previous answers
- Weitere Antworten anzeigen