Rechenfehler oder mach ich da was total falsch..

Guten Abend an die Runde!!

ich möchte folgendes berechnen..

die Werte die als int übergeben werden sind: Wert: 511 Sensideal: 84 Senskorr: +1

die Berechnung habe ich so geschrieben:

unsigned int HoeheS1 = ((Wert * Sensideal /512) + Senskorr);

jedoch wird so ein total falsches Ergebniss berechnet..

wenn ich aber so schreibe:

unsigned int t1 = (Wert * Sensideal); unsigned int t2 = (t1 /512);

unsigned int HoeheS2 = (t2 - Senskorr);

kommt plötzlich das richtige Ergebnis raus...

Kann mir evtl. jemand erklären warum....

ich komm da grad irgendwie nicht dahinter...

Danke und noch einen schönen Abend!!

Schau dir mal den Wertebereich eines ints an. 511 * 84 = 42924

Also entweder als unsigned int übergeben oder sicherheitshalber gleich eine der Zahlen auf unsigned long casten. z.B.:

unsigned int HoeheS1 = (((unsigned long)Wert * Sensideal / 512) + Senskorr);

Das sollte sollte aber bei getrennten Berechnung eigentlich genauso sein

StefanB79: die Werte die als int übergeben werden sind: Wert: 511 Sensideal: 84 Senskorr: +1

die Berechnung habe ich so geschrieben:

unsigned int HoeheS1 = ((Wert * Sensideal /512) + Senskorr);

jedoch wird so ein total falsches Ergebniss berechnet..

Vorzeichenbehaftete 16-Bit Integer gehen nur bis maximal 32767, und Deine Zwischenrechnung 511*84 ergibt bereits 42924.

Mit unsigned int bis maximal 65535 tritt dagegen kein Zahlenüberlauf in der Zwischenrechnung auf.

... damit ich dass jetzt richtig verstehe

Das Problem an dieser Formel

unsigned int HoeheS1 = ((Wert * Sensideal /512) + Senskorr);

ist dass ich das Ergebnis zwar als unsigned int definiere, aber in diese Formel int-Werte übergebe, was er dann nicht berechnen kann da, wie oben schon geschrieben, ein Zwischenergebnis der Berechnung schon über 32767 ist...

aber wie auch oben schon geschrieben wurde sollte das Problem dann ja auch so bei der getrennten Berechnung so sein?? wobei es evtl. daran liegen könnte dass

ich in den ersten Teil : unsigned int t1 = (Wert * Sensideal);

int 511 * int 84 übergebe, was dann 42924 ergibt, jedoch als unsigned int deklariert ist

welches ich dann als unsigned int an die nächste(n) Formel übergebe.. unsigned int t2 = (t1 /512);

unsigned int HoeheS2 = (t2 - Senskorr);

denn ganz sicher ist, dass alles in einer Formel nicht funktoniert, jedoch aufgetrennt funktioniert er einwandfrei. Es kann dann doch nur an der Deklaration des Übergabewertes zwischen 1ter und 2ter Formel liegen..

Danke für die schnellen Antworten! noch einen schönen Feierabend!

Ja. Die Variable der du das Ergebnis zuweist ist egal. Es kommt auf die Datentypen der Zwischenwerte an.

Die beste Lösung ist wie gesagt einen der Werte auf einen höheren Datentypen zu casten (unsigned long ist hier angebracht wenn du größer als 65535 werden kannst). Bei Konstanten kann man auch den Typ angeben; z.B. 512U (unsigned int) oder 512UL (unsigned long). Dann können die Parameter ruhig int sein, und du kannst trotzdem in größeren Wertebereichen rechnen.

OK nochmals Danke!

Jetzt ist es mir klar!

Gruß Stefan