rechnen in c

Gast #4442907
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?
Gast #4442919
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.
Gast #4442920
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...
#4442921
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
Gast #4442924
> jedoch bringt die Verwendung von sinus1
> eine 100% Verbesserung

Ich meine umgekehrt:
jedoch bring die Verwendung von sinus2 eine 100% Verschlechterung
#4442926
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.
#4442955
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.