Frage

Die meisten Mathematiker sind sich einig, dass:

eπi + 1 = 0

Die meisten Gleitkomma-Implementierungen sind jedoch anderer Meinung.Wie gut können wir diesen Streit beilegen?

Ich bin gespannt auf verschiedene Sprachen und Implementierungen sowie verschiedene Methoden, um das Ergebnis so nahe wie möglich an Null zu bringen.Seien Sie kreativ!

War es hilfreich?

Lösung

Es ist nicht so, dass die meisten Gleitkomma-Implementierungen anderer Meinung sind, es liegt nur daran, dass sie nicht die erforderliche Genauigkeit erreichen können, um eine 100-prozentige Antwort zu erhalten.Und die richtige Antwort ist, dass sie es nicht können.

PI ist eine unendliche Reihe von Ziffern, die niemand anders als durch eine symbolische Darstellung bezeichnen konnte, und e^X ist dasselbe, und daher ist der einzige Weg, eine 100-prozentige Genauigkeit zu erreichen, die symbolische Darstellung.

Andere Tipps

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

  • Planen: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i (Chez-Schema, MIT-Schema)
    • 0.0+1.22460635382238e-16i (List)
    • 0.0+1.22464679914735e-16i (Huhn mit numbers Ei)
    • 0.0+1.2246467991473532e-16i (MzScheme, SISC, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i (SCM)
  • Gemeinsames Lispeln: (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) (MRT)
    • Complex(0.0, 1.2246467991473532e-16) (JRuby)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i

Ist es möglich, diesen Streit beizulegen?

Mein erster Gedanke ist, auf eine symbolische Sprache zu achten Ahorn.Ich glaube allerdings nicht, dass das als Gleitkomma zählt.

Wie stellt man eigentlich dar? ich (oder J für die Ingenieure) in einer herkömmlichen Programmiersprache?

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

Ich stimme Ryan zu, Sie müssten auf ein anderes Zahlendarstellungssystem umsteigen.Die Lösung liegt außerhalb des Bereichs der Gleitkomma-Mathematik, da Pi als unendlich lange Dezimalzahl dargestellt werden muss, sodass jedes Schema mit begrenzter Genauigkeit einfach nicht funktionieren wird (zumindest nicht ohne die Verwendung einer Art Fudge-Faktor, um den Verlust auszugleichen). Präzision).

Ihre Frage erscheint mir etwas seltsam, da Sie offenbar andeuten, dass die Gleitkomma-Mathematik von der Sprache implementiert wird.Das stimmt im Allgemeinen nicht, da die FP-Berechnung mithilfe eines Gleitkommaprozessors in der Hardware erfolgt.Aber ob es sich um Software oder Hardware handelt, Gleitkommazahlen werden immer ungenau sein.So funktionieren Floats.

Wenn Sie eine höhere Präzision benötigen, müssen Sie eine andere Zahlendarstellung verwenden.Genauso wie wenn Sie ganzzahlige Berechnungen mit Zahlen durchführen, die nicht in ein int oder long passen.Einige Sprachen verfügen über integrierte Bibliotheken (ich weiß, dass Java BigInteger und BigDecimal hat), aber Sie müssten diese Bibliotheken explizit anstelle von nativen Typen verwenden, und die Leistung wäre (manchmal erheblich) schlechter als bei der Verwendung von Floats.

@Ryan Fox

Wie stellt man eigentlich i (oder j für die Ingenieure) in einer herkömmlichen Programmiersprache dar?

Native komplexe Datentypen sind alles andere als unbekannt.Fortran hatte es Mitte der sechziger Jahre und das OP weist eine Reihe anderer Sprachen auf, die sie in seiner Nachfolge unterstützen.

Und komplexe Zahlen können als Bibliotheken zu anderen Sprachen hinzugefügt werden (bei Operatorüberladung sehen sie sogar genauso aus wie native Typen im Code).

Aber sofern Sie keinen Sonderfall für dieses Problem angeben, ist die „Nichtübereinstimmung“ nur ein Ausdruck ungenauer Maschinenarithmetik, nicht wahr?Es ist, als würde man sich darüber beschweren

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

endet mit (t != 0) (Zumindest wenn Sie einen dummen Compiler verwenden) ...

Ich habe lange Kaffeegespräche mit meinem besten Kumpel geführt und über irrationale Zahlen und den Unterschied zwischen anderen Zahlen gesprochen.Nun, wir sind uns beide in dieser unterschiedlichen Sichtweise einig:

Irrationale Zahlen sind Beziehungen, als Funktionen, in gewisser Weise, in welcher Weise?Nun, denken Sie darüber nach: „Wenn Sie einen perfekten Kreis wollen, geben Sie mir einen perfekten Pi“, aber Kreise unterscheiden sich von den anderen Figuren (4 Seiten, 5, 6 ...)100, 200) aber...Wie viele Seiten hast du noch? Es sieht eher wie ein Kreis aus.Wenn Sie mir bisher gefolgt sind, ist die Pi-Formel die Verbindung all dieser Ideen:enter image description here

Pi ist also eine Funktion, aber eine, die niemals endet!wegen des ∞-Parameters, aber ich denke gerne, dass Sie eine „Instanz“ von pi haben können. Wenn Sie den ∞-Parameter für einen sehr großen Int ändern, erhalten Sie eine sehr große pi-Instanz.

Das Gleiche gilt für e. Geben Sie mir einen riesigen Parameter, ich gebe Ihnen einen riesigen e.

Alle Ideen zusammenfassen:

Da wir Speicherbeschränkungen haben, stellen uns die Sprache und die Bibliotheken riesige Instanzen irrationaler Zahlen zur Verfügung, in diesem Fall Pi und E. Als Endergebnis haben Sie einen langen Weg, um 0 zu erhalten, wie in den Beispielen von @Chris Jester-Young

Wie stellt man eigentlich i (oder j für die Ingenieure) in einer herkömmlichen Programmiersprache dar?

In einer Sprache, die keine native Darstellung hat, wird sie normalerweise mithilfe von OOP hinzugefügt, um eine zu erstellen Complex Klasse zu vertreten i Und j, wobei der Bediener überlastet ist, um Vorgänge, an denen andere beteiligt sind, ordnungsgemäß zu bewältigen Complex Zahlen und/oder andere in der Sprache native Zahlenprimitive.

Z.B: Complex.java, C++ < komplex >

Die numerische Analyse lehrt uns, dass man sich nicht auf den genauen Wert kleiner Unterschiede zwischen großen Zahlen verlassen kann.

Dies wirkt sich nicht nur auf die hier in Frage stehende Gleichung aus, sondern kann zu Instabilität bei allem führen, von der Lösung eines nahezu singulären Satzes gleichzeitiger Gleichungen über die Suche nach den Nullstellen von Polynomen bis hin zur Auswertung von log(~1) oder exp(~0) ( Ich habe sogar spezielle Funktionen zum Auswerten von log(x+1) und (exp(x)-1) gesehen, um dies zu umgehen.

Ich möchte Sie ermutigen, nicht daran zu denken, die Differenz auf Null zu setzen – das ist nicht möglich –, sondern die damit verbundenen Berechnungen so durchzuführen, dass der minimale Fehler gewährleistet ist.

Es tut mir leid, es ist 43 Jahre her, dass mir das an der Uni eingetrichtert wurde, und selbst wenn ich mich an die Referenzen erinnern könnte, bin ich mir sicher, dass es jetzt bessere Sachen gibt.Ich schlage vor Das als Ausgangspunkt.


Wenn das etwas herablassend klingt, entschuldige ich mich.Mein „Numerical Analysis 101“ war Teil meines Chemiekurses, da es damals noch nicht viel Informatik gab.Ich habe nicht wirklich ein Gespür für den Stellenwert/die Bedeutung der numerischen Analyse in einem modernen CS-Kurs.

Dies ist eine Einschränkung unserer aktuellen Gleitkomma-Rechenarchitekturen.Gleitkomma-Arithmetik ist nur eine Annäherung an numerische Pole wie e oder pi (oder alles, was über die Genauigkeit hinausgeht, die Ihre Bits zulassen).Ich mag diese Zahlen wirklich, weil sie sich einer Klassifizierung entziehen und eine größere Entropie (?) zu haben scheinen als gerade Primzahlen, die eine kanonische Reihe sind.Ein Verhältnis trotzt der numerischen Darstellung, manchmal können solche einfachen Dinge einen Menschen umhauen (ich liebe es).

Glücklicherweise können ganze Sprachen und Bibliotheken präzisen trigonometrischen Funktionen gewidmet werden, indem Notationskonzepte verwendet werden (ähnlich denen, die von beschrieben werden). Lasse V.Karlsen ).

Stellen Sie sich eine Bibliothek/Sprache vor, die Konzepte wie e und pi in einer Form beschreibt, die eine Maschine verstehen kann.Hat eine Maschine eine Vorstellung davon, was ein perfekter Kreis ist?Wahrscheinlich nicht, aber wir können ein Objekt erstellen – einen Kreis, der alle bekannten Merkmale erfüllt, die wir ihm zuschreiben (konstanter Radius, das Verhältnis von Radius zu Umfang beträgt 2*pi*r = C).Ein Objekt wie Pi wird nur durch das oben genannte Verhältnis beschrieben.r & C können numerische Objekte sein, die mit der von Ihnen gewünschten Genauigkeit beschrieben werden.e kann definiert werden als „das e die eindeutige reelle Zahl ist, so dass der Wert der Ableitung (Steigung der Tangente) der Funktion f(x) = ex am Punkt x = 0 genau 1 ist“ von Wikipedia.

Lustige Frage.

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