rechnen in c

Gast #4442907
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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...
#4442926
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren