Unklarheit beim Ergebnis einer Berechnung
-
Hallo,
ich habe einen Algorithmus, welcher in Matlab implementiert ist, in C++ umzusetzen. Ich bekomme auf diese Berechnung in Matlab folgendes Ergebnis:
372.7128^2 + (382.6950 - 320)^2 = 1.4285e+05
Meine Berechnung in C++ schaut so aus:
pow(372.7128, 2) + pow((382.6950 - 320), 2)
Als Ergebnis zeigt mir C++: 148383.
Erst dachte ich, dass das nur an der Darstellung des Ergebnisses liegt, das Problem ist allerdings, dass es dann mit acos - Funktionen weitergeht, mit denen Matlab in diesem Zahlenbereich umgehen kann, es bei C++ aber dann natürlich mit NAN scheitert. Den gesamten Algorithmus darf ich leider nicht posten.
Kann mir da jemand einen Tipp geben woran das hier liegen könnte?
aja, mein Compiler: g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Danke & Lg
Buzzzz
-
Was gibt denn Matlab bei Arkussinus dann aus? Arkussinus und Arkuskosinus sind nur für den Bereich von -1 bis 1 definiert.
-
Ich bekomme das richtige Ergebnis.
-
Wenn du mit arccos(x) mit |x|>1 arbeiten willst, musst du in den komplexen Bereich gehen. D.h. dein x sollte nicht vom Typ double sein, sondern std::complex.
Kein Problem:
complex<double> z = pow(372.7128, 2) + pow((382.6950 - 320), 2); cout << acos(z) << '\n';
Es kommt heraus:
(0,-12.5626660462939803)
Wo genau liegt denn dein Problem? Beim ArcCos oder bei der Genauigkeit?
-
Deine Ausgabe liegt an der Precision:
#include <iostream> #include <string> #include <cmath> #include <iomanip> int main() { double result = pow(372.7128, 2) + pow((382.6950 - 320), 2); std::cout << std::setprecision(9) << pow(372.7128, 2) << " + " << pow((382.6950 - 320), 2) << " = " << result <<"\n"; }
Ergebnis:
138914.831 + 3930.66302 = 142845.494
-
Hallo,
danke für eure Hilfe. Das Problem liegt daran, dass Matlab mit seinen Ergebnissen eben nicht über bzw. unter 1/-1 kommt und dadurch den acos normal berechnen kann. Mit C++ bekomme ich irgendwas über 100000 und da scheiterts natürlich mit dem acos usw...
Thx & lg
-
-
buzz_lightzyear schrieb:
danke für eure Hilfe. Das Problem liegt daran, dass Matlab mit seinen Ergebnissen eben nicht über bzw. unter 1/-1 kommt ...
Du meinst 1.4285e+05 ist nicht über 1?
-
-
magst du mir auch noch sagen wie?
Danke
-
buzz_lightzyear schrieb:
magst du mir auch noch sagen wie?
Danke
#include <iostream> #include <cmath> int main() { std::cout << std::pow(372.7128, 2) + std::pow((382.6950 - 320), 2) << std::endl; return 0; }
-
da bekomme ich dieses ergebnis: 142845
Das hab ich schon
-
buzz_lightzyear schrieb:
da bekomme ich dieses ergebnis: 142845
Das hab ich schon
Und das ist verschieden von 1.4285e+05?
-
ja
-
buzz_lightzyear schrieb:
ja
Na dann
-
sei so nett und verschwende nicht meine Zeit
-
Fassen wir also zusammen:
- alle hier im Forum bekommen dasselbe heraus, egal ob mit Matlab oder C++
- in deinem Urspungspost ist sind Matlab- und C++-Ergebnis ebenfalls identisch
- du behauptest, das Matlab-Ergebnis wäre was anderes=> Wie sollen wir dir da helfen? Wo genau ist der Widerspruch?
Edit: habe aus deinem letzten Post gelernt, dass es offenbar Zeitverschwendung ist, dir weiter zu helfen.
-
buzz_lightzyear schrieb:
ja
Mathlab hat halt auf 5 gültige Stellen gerundet. Lass es doch auf 6 Stellen runden, dann siehst Du, daß das selbe rauskommt.
VG
-
wob schrieb:
Fassen wir also zusammen:
- in deinem Urspungspost ist sind Matlab- und C++-Ergebnis ebenfalls identischNein im OP steht:
372.7128^2 + (382.6950 - 320)^2 = 1.4285e+05
Meine Berechnung in C++ schaut so aus:
pow(372.7128, 2) + pow((382.6950 - 320), 2)
Als Ergebnis zeigt mir C++: 148383.
1.4285e+05 != 148383
Unterscheiden sich schon an der dritten gültigen Stelle.
VG
-
mgaeckler schrieb:
Nein im OP steht:
372.7128^2 + (382.6950 - 320)^2 = 1.4285e+05
Meine Berechnung in C++ schaut so aus:
pow(372.7128, 2) + pow((382.6950 - 320), 2)
Als Ergebnis zeigt mir C++: 148383.
Was aber irgendwie im Widerspruch zu
buzz_lightzyear schrieb:
da bekomme ich dieses ergebnis: 142845
Das hab ich schon
zu stehen scheint.