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:
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:
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
Lies die von C ++ (64bit double) erzeugten Zahlen in Mathematica ein - & gt; berechnet die Summe und es gibt die gleiche 4.32402
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?
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
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!
[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.
Tags und Links c++ c++11 random wolfram-mathematica random-sample