Hallo zusammen, ich versteh den Fehler nicht. Ich möchte auf einem PIC32 Gleitkommazahlen multiplizieren und bekomme unterschiedliche Ergebnisse für long double a = 0.0012..........; long double b = 0.000123........; long double ahalb = a/2; long double sinus1 = sin(ahalb); long double sinus2 = sin(a/2); sinus1 liefert den richtigen wert, sinus2 nicht. Wo ist das Problem?
nichtgerne schrieb: > sinus1 liefert den richtigen wert, sinus2 nicht. Welche Werte erhälst du? C, C++ oder eine andere Sprache?
Sprache ist C (XC32 Compiler), die Werte kann ich dir leider nicht sagen(vermutlich 0 für sinus2), weil das Ergebnis die Komponenten einer Matrix bilden, und nach der Multiplikation mit einem Vektor für den Fall, dass ich sinus2 verwende immer der 0-Vektor rauskommt, im Fall sinus1 jedoch der richtige. Es ist durchaus möglich, dass andere Fehler im Programm sind (die Rechnung geht ja noch weiter), jedoch bringt die Verwendung von sinus1 eine 100% Verbesserung und ich verstehe nicht, warum.
Das klingt doch stark nach einem anderen Problem im Programm. Lass dir sinus1/2 mal direkt auf den PC ausgeben (printf o.ä.). Vielleicht auch ein später auftretender Speicherfehler mit wilden Pointern oder so...
Versuch mal statt /2 zu schreiben /2.0 Kann ja sein dass der Compiler da nen Cast-Bug hat oder so... Ansonsten durch z.B. vertauschen der Argumente im Sinus der Sache näher auf den Grund gehen. Wenn sich damit nichts ändert isses was anderes
:
Bearbeitet durch User
> jedoch bringt die Verwendung von sinus1 > eine 100% Verbesserung Ich meine umgekehrt: jedoch bring die Verwendung von sinus2 eine 100% Verschlechterung
nichtgerne schrieb: > Es ist durchaus möglich, dass andere Fehler im Programm sind (die > Rechnung geht ja noch weiter), jedoch bringt die Verwendung von sinus1 > eine 100% Verbesserung und ich verstehe nicht, warum. Ob nun a/2 zuerst in einer Variable gespeichert wird oder nicht, sollte keine Rolle spielen. Der Compiler wird das höchstwahrscheinlich so oder so optimieren, so dass schlussendlich der gleiche Code generiert wird. Ich vermute, der Fehler liegt an einer anderen Stelle. Beachte, dass die Funktion sin in C als Argument einen double erwartet und auch einen solchen zurückliefert.
:
Bearbeitet durch User
danke, ich probiere weiter. Ich hatte nur gehofft, dass mir irgendein (für andere) offensichtlicher Fehler unterlaufen ist.
nichtgerne schrieb: > Ich hatte nur gehofft, dass mir irgendein (für andere) offensichtlicher > Fehler unterlaufen ist. Wie oben schon bemerkt, passt die Verwendung vom Datentyp long double nicht mit der Verwendung der Funktion sin() zusammen. Die generelle Korrektheit solcher Berechnungen kann man gut am PC prüfen. Hier kann man Zwischenergebnisse sehr einfach an der Konsole oder in einer Datei ausgeben. Wahrscheinlich liegt der Fehler an einer anderen Stelle im Code.
nichtgerne schrieb: > die Werte kann ich dir leider nicht sagen(vermutlich 0 für sinus2) nichtgerne schrieb: > danke, ich probiere weiter. Dann probier erstmal, das Problem zu isolieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.