Unklarheit beim Ergebnis einer Berechnung
-
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.
-
manni66 schrieb:
Was aber irgendwie im Widerspruch zu
buzz_lightzyear schrieb:
da bekomme ich dieses ergebnis: 142845
Das hab ich schon
zu stehen scheint.
Nicht nur scheint.
VG
-
du bist glaube ich ein wenig verwirrt:
372.7128^2 + (382.6950 - 320)^2 = 1.4285e+05
was berechnet WolframAlpha?:
https://www.wolframalpha.com/input/?i=372.7128%5E2+%2B+(382.6950+-+320)%5E2
Ergibt: 142845.49430884was sagt WolframAlpha zu deinem Ergebnis:
https://www.wolframalpha.com/input/?i=1.4285e%2B05
Ergibt: 142850deine Angabe von 1.4285e+05 ist einfach nur ein bisschen anders gerundet und in einer anderen Schreibweise
#include <cmath> #include <cstdio> int main() { double value =pow(372.7128, 2.0) + pow((382.6950 - 320.0), 2.0); printf("%f\n", value); printf("%f\n", acos(value)); }
lass es dir von cpp.sh Online Ausgeben
cpp.sh/6y3iq142845.494309 - nur anders gerundet genau das Ergebnis von WolframAlpha
nan**Also: bis hier her sind deine acos-Eingangs-Werte in WolframAlpha(Matematica) und C/C++
absolut identisch zu deinem Matlab acos EingangEs ist nur der acos der sich anders verhält
**dein Problem ist jetzt nur:
dein Eingangswert von ~142850 ist absolut nicht in [-1,1]
der acos ist eben nur für -1|1 definiert - ergibt also NaN - und dein Matlab-acos scheint da was anderes zu machenTips bisher: möglicherweise mit komplexen Zahlen?
was sagt WolframAlpha:
https://www.wolframalpha.com/input/?i=acos%5B372.7128%5E2+%2B+(382.6950+-+320)%5E2%5Dsieht so aus als würde da eine komplexe Zahl rauskommen
was mit wobs Aussage übereinstimmt
#include <complex> #include <cmath> #include <iostream> int main() { std::complex<double> z = pow(372.7128, 2.0) + pow((382.6950 - 320.0), 2.0); std::cout << acos(z) << '\n'; }
lass es dir von cpp.sh Online Ausgeben
cpp.sh/9abs35Ergibt:
(0,-12.5627)Matlab wird definitiv mit einer komplexen Zahl weiter rechnen - und du denkst eben es sollte eine reelle sein - was sie nicht ist
jetzt du
-
manni66 schrieb:
buzz_lightzyear schrieb:
da bekomme ich dieses ergebnis: 142845
Das hab ich schon
Und das ist verschieden von 1.4285e+05?
Sag mal buzz_lightzyear, bist du wirklich so doof oder tust du nur so?
Ich würde eher sagen DU verschwendest UNSERE Zeit und deine eigene übrigens auch...