Eine kleine Ablenkung in Gleitkommazahl (im) Präzision, Teil 1

stimmen
16

Die meisten Mathematiker einig, dass:

e πi + 1 = 0

Allerdings widersprechen die meisten Gleitkomma-Implementierungen. Wie gut können wir siedeln diesen Streit?

Ich bin daran interessiert, über die verschiedenen Sprachen und Implementierungen zu hören, und verschiedene Methoden, um das Ergebnis so nahe bei Null wie möglich zu machen. Seien Sie kreativ!

Veröffentlicht am 04/08/2008 um 07:21
quelle vom benutzer
In anderen Sprachen...                            


10 antworten

stimmen
16

Es ist nicht, dass die meisten Gleitkomma-Implementierungen nicht einverstanden sind, ist es nur, dass sie nicht die Genauigkeit erhalten können notwendig, eine 100% Antwort zu bekommen. Und die richtige Antwort ist, dass sie es nicht können.

PI ist eine unendliche Reihe von Ziffern, dass niemand durch etwas anderes als eine symbolische Darstellung bezeichnen konnte, und e ^ X das gleiche ist, und somit der einzige Weg zu 100% Genauigkeit zu erhalten, ist symbolisch zu gehen.

Beantwortet am 26/12/2008 um 21:22
quelle vom benutzer

stimmen
8

Hier ist eine kurze Liste von Implementierungen und Sprachen, die ich ausprobiert habe. Es ist durch die Nähe zu Null sortiert:

  • Planen: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i(Chez Scheme, MIT Scheme)
    • 0.0+1.22460635382238e-16i(Guile)
    • 0.0+1.22464679914735e-16i(Huhn mit numbersEi)
    • 0.0+1.2246467991473532e-16i(MzScheme, SISC, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i(SCM)
  • Common Lisp: (1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20)(CLISP)
    • #C(0.0d0 1.2246063538223773d-16)(CMUCL)
    • #C(0.0d0 1.2246467991473532d-16)(SBCL)
  • Perl: use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • Python: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j(CPython)
  • Rubin: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16)(MRI)
    • Complex(0.0, 1.2246467991473532e-16)(JRuby)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i
Beantwortet am 04/08/2008 um 07:22
quelle vom benutzer

stimmen
5

Ist es möglich, diesen Streit beizulegen?

Mein erster Gedanke ist eine symbolische Sprache zu suchen, wie Maple . Ich glaube nicht , dass zählt , als ob Punkt schweben.

In der Tat, wie funktioniert repräsentiert eine i (oder j für die Ingenieure) in einer herkömmlichen Programmiersprache?

Vielleicht ein besseres Beispiel ist sin (π) = 0? (Oder habe ich den Punkt verpasst wieder?)

Beantwortet am 04/08/2008 um 07:29
quelle vom benutzer

stimmen
4

Ihre Frage scheint ein wenig seltsam für mich, wie Sie zu sein scheinen darauf hindeutet, dass die Floating Point Mathematik durch die Sprache umgesetzt wird. Das ist im Allgemeinen nicht praktikabel, da die FP Mathematik einen Gleitkomma-Prozessor in Hardware erfolgt über. Aber Software oder Hardware, Floating-Point wird immer ungenau sein. Das ist nur, wie schwimmt Arbeit.

Wenn Sie eine bessere Präzision benötigen benötigen Sie eine andere Zahlendarstellung zu verwenden. Genau wie wenn Sie integer Mathematik auf Zahlen tun, die in einem int oder lang nicht passen. Einige Sprachen haben Bibliotheken für den eingebauten (ich weiß, Java hat BigInteger und BigDecimal), aber man müßte explizit diese Bibliotheken statt native Typen verwenden, und die Leistung wäre (zum Teil deutlich) schlimmer, als wenn Sie verwendet schwimmen.

Beantwortet am 25/08/2008 um 14:37
quelle vom benutzer

stimmen
4

@ Ryan Fox

In der Tat, wie funktioniert repräsentiert eine i (oder j für die Ingenieure) in einer herkömmlichen Programmiersprache?

Einheimische komplexe Datentypen sind bei weitem nicht unbekannt. Fortran hatte es bis Mitte der sechziger Jahre, und die OP zeigt eine Vielzahl von anderen Sprachen, die sie in hist Followup unterstützen.

Und komplexe Zahlen können in anderen Sprachen als Bibliotheken hinzugefügt werden (mit Operator Überlastung sie sogar genauso wie native Typen im Code suchen).

Aber wenn Sie einen Sonderfall für dieses Problem bieten, die „nicht-Vereinbarung“ ist nur ein Ausdruck ungenau Maschine Arithmetik, nicht wahr? Es ist wie beschweren, dass

float r = 2/3;
float s = 3*r;
float t = s - 2;

endet mit (t! = 0) (zumindest, wenn Sie einen dumm genug Compiler verwenden) ...

Beantwortet am 25/08/2008 um 14:29
quelle vom benutzer

stimmen
4

Ich stimme mit Ryan, würden Sie auf eine andere Nummer Darstellungssystem verschieben müssen. Die Lösung ist außerhalb des Bereichs der Gleitkomma-Mathematik, weil Sie pi müssen als eine unendlich lange Dezimalzahl dargestellt, so jedes begrenzte Genauigkeit Schema ist einfach nicht (zumindest nicht ohne den Einsatz eine Art von Fudge-Faktor zur Arbeit zu gehen, die verlorenen nachholen Präzision).

Beantwortet am 25/08/2008 um 02:10
quelle vom benutzer

stimmen
2

Ich hatte looooong Kaffee-Chats mit meinem besten Kumpel redet über irrationale Zahlen und die diference zwischen anderen Zahlen. Nun, wir beide in diesem anderen Standpunkt zustimmen:

Irrationale Zahlen sind Beziehungen, wie Funktionen, in einer Art und Weise, wie? Nun, darüber nachzudenken „wenn Sie einen perfekten Kreis wollen, geben Sie mir eine perfekte pi“, sondern Kreise auf die anderen Figuren sind diferent (4 Seiten, 5, 6 ... 100, 200), aber ... Wie viele Seiten tun Sie haben, mehr wie ein Kreis, wie es aussieht. Wenn Sie mir so weit folgen, diese Ideen alle hier verbindet, ist die pi Formel: Geben Sie hier image description

Also, pi ist eine Funktion, aber eine, die nie endet! wegen des ∞ Parameters, aber ich, dass Sie „Instanz“ haben von pi können denken mögen, wenn Sie die ∞ Parameter für eine sehr große Int ändern, haben Sie eine sehr große pi-Instanz.

Das Gleiche gilt für e, geben Sie mir einen großen Parameter, gebe ich Ihnen eine große e.

Putting alle Ideen zusammen:

Wie wir Speicherbeschränkungen haben, bieten die Sprache und Libs uns große Instanz von irrationalen Zahlen, in diesem Fall pi und e, als Endergebnis, werden Sie lange aproach haben 0 zu bekommen, wie die von @ Chris Jester-Young bereitgestellten Beispiele

Beantwortet am 06/05/2017 um 03:07
quelle vom benutzer

stimmen
2

Es ist eine Beschränkung unserer aktuellen Gleitkomma-Rechenarchitekturen. Gleitpunktarithmetik ist nur eine Annäherung an numerischen Pole wie e oder pi (oder irgendetwas über die Präzision Ihrer Bits erlauben). Ich genieße wirklich, diese Zahlen, weil sie Klassifizierung trotzen und scheinen größere Entropie zu haben (?) Als auch Primzahlen, die eine kanonische Reihe sind. Eine numerische Darstellung des Verhältnisses defy, manchmal einfache Dinge wie, dass kann eine Person, die umhaut (Ich liebe es).

Zum Glück gesamte Sprachen und Bibliotheken können mit Notations Konzepte (ähnlich denen beschrieben Präzision trigonometrische Funktionen gewidmet Lasse V. Karlsen ).

Betrachten wir eine Bibliothek / Sprache , die Konzepte wie e und pi in einer Form beschreibt , dass eine Maschine verstehen. Hat eine Maschine jede Vorstellung davon , was ein perfekter Kreis ist? Wahrscheinlich nicht, aber wir können ein Objekt erstellen - Kreis, der die bekannten Merkmale erfüllt alle wir es nennen ( mit konstantem Radius, Verhältnis von Radius zu Umfang ist 2 * pi * R = C). Ein Objekt wie pi wird nur durch das vorstehend erwähnte Verhältnis beschrieben. r & C kann durch alles , was Präzision Sie beschrieben numerische Objekte sein , ihnen zu geben. e definiert werden „ wie die E die einzigartige reelle Zahl ist , so dass der Wert der Ableitung (Steigung der Tangentenlinie) der Funktion f (x) = ex an dem Punkt x = 0 ist genau 1“ von wikipedia .

Fun Frage.

Beantwortet am 20/11/2009 um 21:37
quelle vom benutzer

stimmen
2

Numerische Analysis lehrt uns, dass Sie sich nicht auf den genauen Wert der kleinen Unterschiede zwischen großen Zahlen verlassen können.

Dies wirkt sich nicht nur die Gleichung in Frage hier, aber Instabilität, um alles von der Lösung eine nahezu singulären Satz simultaner Gleichungen, durch Auffinden der Nullstellen von Polynomen, um die Bewertung log (~ 1) oder exp (~ 0) bringen kann ( ich habe sogar spezielle Funktionen für die Auswertung log (x + 1) und (exp (x) -1) umgehen diese) zu sehen.

Ich möchte Sie ermutigen, nicht in Begriffen zu denken, den Unterschied Nullstellung - Sie können nicht - sondern in wie die dazugehörigen Berechnungen in einer solchen Art und Weise tun, den minimalen Fehler zu gewährleisten.

Ich tut mir leid, es 43 Jahre her , seit ich hatte dies in mir an der Uni getrommelt, und selbst wenn ich die Referenzen erinnern kann, ich bin sicher , dass es bessere Sachen um jetzt. Ich schlage vor , diese als Ausgangspunkt.


Wenn das ein bisschen gönnerhaft klingt, entschuldige ich mich. Meine „Numerische Analysis 101“ war ein Teil meines Chemie natürlich da es nicht viel CS war in jenen Tagen. Ich habe nicht wirklich ein Gefühl für den Ort / die Bedeutung in einem modernen CS Kurs numerische Analyse hat.

Beantwortet am 26/12/2008 um 22:22
quelle vom benutzer

stimmen
2

In der Tat, wie funktioniert repräsentiert eine i (oder j für die Ingenieure) in einer herkömmlichen Programmiersprache?

In einer Sprache , die nicht über eine native Darstellung hat, wird hinzugefügt , in der Regel OOP mit einer schaffen ComplexKlasse zu vertreten iund jmit Operator mit Operationen , die andere , um richtig zu umgehen Überlastung ComplexZahlen und oder eine andere Anzahl Primitiven stammen aus der Sprache.

ZB: Complex.java , C ++ <Komplex>

Beantwortet am 25/08/2008 um 14:48
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more