Forum: Mikrocontroller und Digitale Elektronik rechnen in c


von nichtgerne (Gast)


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?

von B. S. (bestucki)


Lesenswert?

nichtgerne schrieb:
> sinus1 liefert den richtigen wert, sinus2 nicht.

Welche Werte erhälst du? C, C++ oder eine andere Sprache?

von nichtgerne (Gast)


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.

von Dr. Sommer (Gast)


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...

von Kai I. (kderh)


Lesenswert?

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
von nichtgerne (Gast)


Lesenswert?

> jedoch bringt die Verwendung von sinus1
> eine 100% Verbesserung

Ich meine umgekehrt:
jedoch bring die Verwendung von sinus2 eine 100% Verschlechterung

von B. S. (bestucki)


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.

: Bearbeitet durch User
von nichtgerne (Gast)


Lesenswert?

danke, ich probiere weiter.
Ich hatte nur gehofft, dass mir irgendein (für andere) offensichtlicher 
Fehler unterlaufen ist.

von Mark B. (markbrandis)


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.

von Wolfgang (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.