Frage

Also ich weiß, um den Punkt precision floating (und wie Dinge wie 1.1 können nicht genau in binär ausgedrückt werden) und so weiter, aber ich frage mich: wie dann, tun Mathe-bezogene Bibliotheken implementieren unendliche Präzision? Mit anderen Worten, wie würden Sie repräsentieren zum Beispiel 1.1 genau in binären? Nur eine kurze Beschreibung wäre toll, kann ich die genauen Details selbst herausfinden. Vielen Dank. :)

War es hilfreich?

Lösung

Es gibt keine unendliche Genauigkeit Bibliotheken, aber es gibt beliebige Genauigkeit Bibliotheken. Einzelheiten, wie diese umgesetzt werden, lesen Sie einige Dokumentation : -)

Zur Darstellung 1.1 genau in binär, Fließkomma kann nicht, wie Sie darauf hinweisen, richtig verwendet werden. Es kann dargestellt werden, wenn Sie den integralen Bestandteil (1) als eine ganze Zahl speichern, und den Bruchteil (0,1) als ein andere ganze Zahl ist, und dann müssen Sie die Logik schaffen, mit diesen Strukturen zu beschäftigen. Alternativ könnte sie als Bruch gespeichert werden (11/10) sowohl mit dem Nenner und den als ganzen Zahlen gespeichert Zählern.

Andere Tipps

Wenn Sie wirklich unendliche Genauigkeit bedeuten, gibt es zwei Möglichkeiten:

  • irgendeine Form von fauler Berechnung verwenden. Dann können Sie eine Zahl für so viel Präzision fragen, wie Sie wollen „nach“ die Berechnung ausgeführt wird (da es faul ist es eigentlich nur dann geschehen). Der Nachteil ist, dass dies sehr ineffizient ist. Sie können in einer Sprache wie Haskell dies tun, ein spezielles Nummer-System, wo Darstellungen überlappen, z.B. Basis 2 mit Ziffern -1, 0, 1. Die übliche Darstellung ist ungeeignet, weil bei 1 sagen Sie unendliche Genauigkeit müssen entscheiden, zwischen 0 ausgeben für 0,999 ... und 1 für 1.000 ...

  • Sie symbolisch Berechnung. Für ganze Zahlen, rationals, Wurzeln, usw. genau. Dies ist erforderlich, wenn Sie Gleichheit entscheiden wollen, sondern auch ziemlich ineffizient und beschränkt sich auf Sonderfälle.

Mathematische Bibliotheken mit unendlich Präzision nicht umgesetzt werden. Es kann nicht getan werden. Die Zahl 1/3 kann nicht in einer endlichen Anzahl von Bits dargestellt werden, die nicht als Fraktion. Transzendente Zahlen wie pi und e nicht vollständig in irgendeiner Art und Weise dargestellt werden.

Auf der anderen Seite ist es möglich, Mathematikbibliotheken mit großer Präzision zu erstellen. Es ist alles eine Frage der genügend Bits für die Mantisse der Gleitkomma-Wert zugewiesen wird.

Es gibt bestimmte geometrische Algorithmen, die auf exakte Arithmetik abhängen, wenn Sie also in der CGAL Bibliothek suchen finden Sie eine Vielzahl von genauen numerischen Typen finden, die unter verschiedenen Operationen „geschlossen“. Das heißt, es gibt keine Möglichkeit, die unterstützten Operationen zu verwenden, um ein Ergebnis zu erzeugen, die nicht exakt dargestellt werden können.

Einige Beispiele:

  • Ganze Zahlen werden unter Addition und Multiplikation geschlossen.

  • Rationals sind auch unter Division geschlossen, mit Ausnahme eines Sonderfall für Null. Kann als ein Paar von ganzen Zahlen dargestellt werden. Siehe auch die rationale Zahl Funktionen in GMP . zB 1,1 = 11/10, als (11, 10).

  • dargestellt werden
  • eine Zahl ein, die auch unter Quadratwurzel geschlossen ist.

Sie können auch Zahlen in dezimal darstellen und Dezimalarithmetik tun. Die zugrunde liegende Darstellung ist binär in dem Sinne, dass jede Stelle mit einem binären Code dargestellt wird. Jede Ziffer - ob nach links oder rechts vom Komma - wird als ganze Zahl behandelt. Arithmetik erfolgt dann `` manuell '', Ziffer-für-Ziffer.

Ein Beispiel für eine Dezimal-basierte Bibliothek ist BCMath in PHP.

Während Pax ist völlig richtig hier, wenn wir reden über Punkte und Zahlen schwimmen, ich glaube, es gibt eine Lösung, aber es ist sehr ineffizient.
Sie können eine Zeichenfolge verwenden, um Ihre Zahl darzustellen, Strings nicht Verlust Präzision.
Jedes Mal, wenn Sie eine Nummer wie „0.0001“ + „0,1“ haben iterieren Sie beide Zeichenfolge und konvertieren nur die aktuelle Position in einem int.
Schritt 1:
0 + 0 = 0 -> string konvertieren und Daten zuordnen [0]
. Schritt 2:
0 + 1 = 1 -> string konvertieren und Daten zuweisen [1]
. Schritt 3:
iter> "0.1" .lenght (.) -> Stopp

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top