Mathematische Rundung von Gleitkommazahlen in C ++ im Vergleich zu Mathematica

8

Der folgende Beitrag wurde gelöst, das Problem trat auf, weil die Formel auf Ссылка Der Leser wird dringend gebeten, die Seite zu betrachten: Ссылка

Ich habe das folgende seltsame Phänomen, das mich verwirrt!:

Ich habe eine stückweise konstante Wahrscheinlichkeitsdichte als

angegeben %Vor%

Wenn ich n Zufallszahlen (Radius der Kugel in Millimeter) aus dieser Verteilung zeichne und die Masse der Kugel berechne und summiere wie folgt:

%Vor%

Ich bekomme Masse = 4,3283 kg (siehe hier )

>

Machen Sie das EXAKT identische Ding in Mathematica wie:

Gibt den vermutlich korrekten Wert von 4.5287 kg an. (Siehe mathematica )

Was nicht dasselbe ist, auch mit verschiedenen Seeds, C ++ und Mathematica passen nie zusammen! ? Ist das numerische Ungenauigkeit, die ich bezweifle, ist es ...? Frage: Was ist der Hack falsch mit dem Sampling in C ++?

Einfacher Mathematica-Code:

%Vor%

Aktualisieren : Ich habe eine Analyse gemacht:

  1. Lies die von Mathematica erzeugten Zahlen (64bit doubles) in C ++ - & gt; berechnet die Summe und es gibt das gleiche wie Mathematica
    Masse berechnet durch Reduktion: 4.52528010260687096888432279229

  2. Lies die von C ++ (64bit double) erzeugten Zahlen in Mathematica ein - & gt; berechnet die Summe und es gibt die gleiche 4.32402

  3. Ich schließe fast aus, dass das Sampling mit std::piecewise_constant_distribution ungenau ist (oder genau so wie es mit 64-Bit Floats geht) oder einen Fehler hat ... ODER stimmt etwas nicht mit meinen Gewichten?

  4. Die Dichten werden falsch berechnet std::piecewise_constant_distribution in Ссылка === & gt; Es scheint ein Fehler zu sein!

Histogramm Plot der CPP Generierte Werte im Vergleich zur gewünschten Verteilung:     

%Vor%

Die Datei wird hier generiert: CPP zur Nummerngenerierung

    
Gabriel 04.03.2015, 19:14
quelle

2 Antworten

2

Es scheint, dass die Formel für die Wahrscheinlichkeiten für std::piecewise_constant_distribution falsch geschrieben ist   Ссылка

Die Summierung der Gewichte erfolgt ohne die Intervalllängen multipliziert!

Die richtige Formel lautet: Ссылка

Dies löst jede dumme Eigenart, die zuvor als Bug- / Gleitkommafehler erkannt wurde und so weiter!

    
Gabriel 05.03.2015 15:27
quelle
2

[Der folgende Absatz wurde für die Korrektheit bearbeitet. - Notiz des Redakteurs]

Mathematica kann IEEE 754 Fließkommazahlen verwenden oder nicht. Aus der Wolfram-Dokumentation:

  

Die Wolfram Language verfügt über eine hochentwickelte integrierte automatische numerische Präzisions- und Genauigkeitskontrolle. Aber zur speziellen Optimierung numerischer Berechnungen oder zur Untersuchung numerischer Analysen erlaubt die Wolfram Language auch eine detaillierte Kontrolle über Präzision und Genauigkeit.

und

  

Die Wolfram Language behandelt sowohl ganze Zahlen als auch reelle Zahlen mit einer beliebigen Anzahl von Ziffern und markiert bei Bedarf automatisch die numerische Genauigkeit. Die Wolfram Language verwendet intern mehrere hochoptimierte Zahlenrepräsentationen, bietet aber dennoch eine einheitliche Schnittstelle für Finger- und Präzisionsmanipulation, während numerische Analysten bei Bedarf Repräsentationsdetails studieren können.

    
Paul Evans 05.03.2015 11:54
quelle