Hallo! Warum erhalte ich bei a=50; b=-10*a; b/=100; das richtige Ergebnis während bei a=50; b=(-10*a)/100; nur Mist raus kommt???
Weil -10 auch ein ergebins ist. Ich hab's nur soweit Vereinfacht. Es geht um eine lineare Interpolation. So ungefähr siehts im Programm aus:
1 | uint8_t index; |
2 | uint16_t a; |
3 | int16_t b; |
4 | index=rev/1000; |
5 | a=rev%1000; |
6 | lo=a_rev[index]; |
7 | hi=a_rev[index+1]; |
8 | b=(hi-lo)*a; |
9 | b/=1000; |
10 | out=in-lo-b; |
Kottan schrieb:
> So ungefähr siehts im Programm aus:
Mit einem "ungefähr so" können wir kaum was anfangen. Wir bräuchten
schon ein "exakt so", inklusive der Deklarationen aller beteiligten
Variablen. Und es wäre auch sinnvoll, die Variante zu posten, die nicht
funktioniert (deiner Beschreibung aus dem ersten Post nach, ist dieses
"so ungefähr" ja wohl die funktionierende Variante).
b kann einen maximalen (positiven) Wert von 32768 annehmen und da du hier schon mit Tausendern multiplizierst und rechnest, sollte also die Variable wohl etwas klein sein, oder?
und vielleicht auch eine dürre Angabe dazu, wie der "Mist" aussieht, der rauskommt und wie er riecht?
Der Code war nur zur erklärung warum b = -a/10 nicht funktioniert, deshalb auch nur ungefähr. Für das Problem ist das unwichtig. Bei
1 | int main() |
2 | {
|
3 | int16_t b; |
4 | uint16_t a=50; |
5 | b=(-10*a)/100; |
6 | |
7 | return 0; |
8 | }
|
bekomme ich für b: 0xfd76 bzw. 64886 Bei
1 | int main() |
2 | {
|
3 | int16_t b; |
4 | uint16_t a=50; |
5 | b=(-10*a) |
6 | b/=100; |
7 | |
8 | return 0; |
9 | }
|
bekomme ich für b: 0x0005
Kottan schrieb:
>
1 | > int main() |
2 | > { |
3 | > int16_t b; |
4 | > uint16_t a=50; |
5 | > b=(-10*a)/100; |
6 | >
|
7 | > return 0; |
8 | > } |
9 | >
|
> bekomme ich für b: 0xfd76 bzw. 64886 das uint16_t ist der Schlüssel. Damit hast du bei -10*a eine Multiplikation von signed mit unsigned. In so einem Fall gewinnt unsigned und das Bitmuster von -10 wird als unsigned Wert interpretiert. Und das ist dann eine leidlich hohe Zahl. Dieses unsigned Ergebnis wird dann durch 100 dividiert und erst dann erfolgt der Übergang von unsigned nach signed um die Zuweisung zu b durchführen zu können. PS: Dein Ergebnis ist nicht 64886. Da b ein signed Wert ist, ist dein Ergebnis eine negative Zahl. Nämlich -651 >
1 | > int main() |
2 | > { |
3 | > int16_t b; |
4 | > uint16_t a=50; |
5 | > b=(-10*a) |
6 | > b/=100; |
7 | >
|
8 | > return 0; |
9 | > } |
10 | >
|
> bekomme ich für b: 0x0005
Hier ist die Sache anders. Hier erfolgt der Übergang von unsigned nach
signed gleich nach der Multiplikation. Die Division wird bereits als
signed Operation durchgeführt.
Übrigens ist dieses Ergebnis ebenfalls nicht korrekt. Denn eine positive
Zahl mal -10 durch 100 muss ein negatives Ergebnis liefern.
@Kottan ermittelt: was erwartest du eigentlich als "richtig", wenn du eine unsigned mit einer negativen Zahl multiplizierst?
>Übrigens ist dieses Ergebnis ebenfalls nicht korrekt. Denn eine positive >Zahl mal -10 durch 100 muss ein negatives Ergebnis liefern. Beide Ergebnisse sind natürlich negativ. Hatte nur das Vorzeichen vergessen. >@Kottan ermittelt: >was erwartest du eigentlich als "richtig", wenn du eine unsigned mit >einer negativen Zahl multiplizierst? Richtig ist die Zahl die ich sehen will, egal wie es dazu kommt :P >Damit hast du bei -10*a eine Multiplikation von signed mit unsigned. In >so einem Fall gewinnt unsigned und das Bitmuster von -10 wird als >unsigned Wert interpretiert. Ich versuch das jetzt mal zu verstehen: bei -10*a wird zuerst multipliziert und dann subtrahiert. Das Ergebnis is also 0-500 während bei (-10*a)/100 das Ergebnis der Klammer als unsigned gewertet wird und somit hier schon das ergebnis falsch wird. Aber dann sollte doch bei -10*a/100 auch zuerst die Multiplikation und die Division erfolgen welche ja noch richtig wäre und anschließend erst die Subtraktion und das Ergebnis wieder stimmen?
Kottan schrieb: > Ich versuch das jetzt mal zu verstehen: > bei -10*a wird zuerst multipliziert und dann subtrahiert. Da wird überhaupt nichts subtrahiert. -10 hat als signed Zahl das Bitmuster 0xFFF6 Das ist schön, aber für die Multiplkation irrelevant. Denn dort wird diese Bitmuster als unsigned Wert gewertet. -10 * a wobei a als unsigned Wert 50 enthält, ist also auf Bitebene identisch zu einer Multiplkation 65526 * 50 Und das das in die Hose gehen wird, brauch ich wohl nicht extra betonen. 65526 * 50 ergibt 3276300 Nun ist das natürlich nicht das Ergebnis, welches im Rechner entsteht, weil es zu gross für einen int ist. In Hex ausgedrückt wäre das 0xFFF6 * 0x0032 = 0x31FE0C -> 0xFE0C + einen heftigen Überlauf -> wenn man signed und unsigned in einem Ausdruck mischt, sollte man besser sehr, sehr vorsichtig sein. Sowas kann ganz schnell zu enormen Problemen führen.
>>@Kottan ermittelt: >>was erwartest du eigentlich als "richtig", wenn du eine unsigned mit >>einer negativen Zahl multiplizierst? > > Richtig ist die Zahl die ich sehen will, egal wie es dazu kommt :P Richtig ist, dass du dich aufs Glatteis begeben hast und dich jetzt beklagst, dass das Eis zu dünn war. Wenn du in einem Ausdruck gleichzeitig unsigned und negative Zahlen hast, sollte man dir eigentlich dein Lehrbuch solange um die Ohren dreschen, bis nur noch Fetzen davon übrig sind.
>Richtig ist, dass du dich aufs Glatteis begeben hast und dich jetzt >beklagst, dass das Eis zu dünn war. Wenn du in einem Ausdruck >gleichzeitig unsigned und negative Zahlen hast, sollte man dir >eigentlich dein Lehrbuch solange um die Ohren dreschen, bis nur noch >Fetzen davon übrig sind. Keiner beklagt sich hier ;) Die Sache ist es hat ja funktioniert und ich wollte nur wissen warum. Mein Denkfehler war eben das ich hier - als Operator und nicht als Vorzeichen gesehen hab bzw. das ich dachte wenn das Ergebnis signed wird auch die Operanden als signed gerechnet werden. Und ich bin froh das es Leute gibt die einem alles so ausführlich erklären wie man es in keinem Lehrbuch finden würde, was auch der Grund ist warum ich sowas nicht besitzte.
> sollte man dir eigentlich dein Lehrbuch solange um die Ohren dreschen, > bis nur noch Fetzen davon übrig sind. Von den Ohren? LOL :-)
Kottan schrieb: > Und ich bin froh das es Leute gibt die einem alles so ausführlich > erklären wie man es in keinem Lehrbuch finden würde, was auch der Grund > ist warum ich sowas nicht besitzte. Mit so einer Aussage disqualifizierst du dich selbst. Den in jedem besseren Lehrbuch gibt es ein ganzes Kapitel über Datentyp Promotion, welche Regeln gelten und was es dabei alles zu beachten gibt.
Mir stösst dieser Thread inzwischen auch ziemlich säuerlich auf. Es fängt an mit einer Frage, die nur aus Fragmenten besteht, selbst auf mehrfaches Nachfragen kommt Quelltext, der nicht kompilierbar ist mit angeblichen Ergebnissen, die dann auch wieder so gar nicht herauskamen. Weil der OP keinen Bock hat, auch den 5 oder 6 Helfern, die er beschäftigt, auch nur im Mindesten das Leben zu erleichtern, zieht sich ein kleines Standardproblem einige Zeit hin. Und zum Schluß erklärt er auch noch dreist, daß er keine Lust hat, ein Buch in die Hand zu nehmen und wenigstens die elementarsten Dinge zu lernen, ohne andere zu belästigen. Mit anderen Worten: schön, daß es soviele Idioten gibt, die mir das Denken abnehmen. Merkwürdigerweise sind das regelmäßig Leute, die nur als Gast hier herumgeistern.
Versteht hier denn überhaubt keiner Spaß? Doch nicht alles so wörtlich nehmen. Ich wollte doch nur deine auführlichen Antworten loben. Ich bin überzeugt das es gute Literatur gibt wenn man sich wirklich ernsthaft damit beschäftigen will. Für mich ist das ein Hobby das hauptsächlich Spaß machen soll. Und wenn ich mal bei herumprobieren auf eine Frage stoße die ich mir selbst nicht beantworten kann denke ich nicht das es ein Fehler ist diese in einem Forum zu stellen auch wenn sie vielleicht für andere mit mehr Ahnung lächerlich erscheint. So und jetzt will ich nicht mehr weiter vom Thema abkommen, die Frage wurde ja beantwortet. Dafür nochmal in herzliches Dankeschön!
>Mir stösst dieser Thread inzwischen auch ziemlich säuerlich auf. >Es fängt an mit einer Frage, die nur aus Fragmenten besteht, >selbst auf mehrfaches Nachfragen kommt Quelltext, der nicht >kompilierbar ist mit angeblichen Ergebnissen, die dann auch wieder >so gar nicht herauskamen. >Weil der OP keinen Bock hat, auch den 5 oder 6 Helfern, die >er beschäftigt, auch nur im Mindesten das Leben zu erleichtern, >zieht sich ein kleines Standardproblem einige Zeit hin. >Und zum Schluß erklärt er auch noch dreist, daß er keine >Lust hat, ein Buch in die Hand zu nehmen und wenigstens die >elementarsten Dinge zu lernen, ohne andere zu belästigen. >Mit anderen Worten: schön, daß es soviele Idioten gibt, >die mir das Denken abnehmen. >Merkwürdigerweise sind das regelmäßig Leute, die nur als >Gast hier herumgeistern. Ich versteh ja das einem hier viele Fragen(auch meine) lächerlich erscheinen wenn man Ahnung von der Materie hat, aber so so wie du es hier schreibst ist es nun auch wieder nicht. Ich habe bei meiner Frage versucht nur das wesentliche zu schreiben und nachdem nach Details gefragt wurde hab ich mein Programm mit dem ich getestet und das ich auch erfolgreich kompiliert habe hier gepostet. Sowie auch die Ergebnisse nach denen gefragt wurden, auch wenn ich dabei das Vorzeichen vergessen habe. Und das ganze nicht nach mehrmaligen Nachfragen sondern gleich als ich die Antworten gelesen habe. Und ja ich habe keine Bücher zu dem Thema weil es nur ein Hobby für mich ist und es im Internet erstmal reichlich Informationen für Anfänger wie mich gibt. Und ist ist ja nicht so das ich nicht vorher selbst nach einer Antwort gesucht hätte.
Karl heinz Buchegger schrieb: > Den in jedem besseren Lehrbuch gibt es ein ganzes Kapitel über Datentyp > Promotion, welche Regeln gelten und was es dabei alles zu beachten gibt. Seine Methode funktioniert doch ausgezeichnet, es findet sich immer ein Dummer der mehr Zeit investiert als der Frager selbst und das Problem loest.
Kottan schrieb: >>Mir stösst dieser Thread inzwischen auch ziemlich säuerlich auf. > >>Es fängt an mit einer Frage, die nur aus Fragmenten besteht, >>selbst auf mehrfaches Nachfragen kommt Quelltext, der nicht >>kompilierbar ist mit angeblichen Ergebnissen, die dann auch wieder >>so gar nicht herauskamen. > >>Weil der OP keinen Bock hat, auch den 5 oder 6 Helfern, die >>er beschäftigt, auch nur im Mindesten das Leben zu erleichtern, >>zieht sich ein kleines Standardproblem einige Zeit hin. > >>Und zum Schluß erklärt er auch noch dreist, daß er keine >>Lust hat, ein Buch in die Hand zu nehmen und wenigstens die >>elementarsten Dinge zu lernen, ohne andere zu belästigen. >>Mit anderen Worten: schön, daß es soviele Idioten gibt, >>die mir das Denken abnehmen. > >>Merkwürdigerweise sind das regelmäßig Leute, die nur als >>Gast hier herumgeistern. > > Ich versteh ja das einem hier viele Fragen(auch meine) lächerlich > erscheinen wenn man Ahnung von der Materie hat, aber so so wie du es > hier schreibst ist es nun auch wieder nicht. Ich habe bei meiner Frage > versucht nur das wesentliche zu schreiben und nachdem nach Details > gefragt wurde hab ich mein Programm mit dem ich getestet und das ich > auch erfolgreich kompiliert habe hier gepostet. Das erste Post war völlig nichtssagend, weil nicht mal die Datentypen zu sehen waren. Im zweiten waren ein paar Deklarationen, aber von anderen Variablen keine Typen und/oder keine Werte. Im dritten war nicht kompilierbarer Quelltext (keine #include, fehlendes Semikolon); so hast du das bestimmt nicht übersetzt und "getestet". Dazu kamen dann angebliche Ergebnisse, die nicht stimmten. Bis hier wurde schon in 5 Antworten herumgerätselt, wo immer noch keine belastbaren Angaben von dir da waren. Dazu kommt, daß du die ganze Zeit vermutlich hartnäckig Compilerwarnungen einfach ignoriert hast. Das ist einfach Verschwendung der Zeit anderer Leute, und das ist der Punkt, der mich zumindest irgendwie verstimmt. Es geht nicht darum, ob jemand dumm/lächerlich/unwissend ist oder unprofessionell. Viele hier arbeiten nicht jeden Tag mit hochtrabenden Konstruktionen, und alle fangen klein an. Insofern ist die Frage als solche überhaupt nicht zu kritisieren. Aber davon abgesehen, daß viele Probleme mit Nachdenken und einem brauchbaren Buch bei etwas Bemühen gelöst oder zumindest eingekreist werden können, ist es m.E. absolutes Minimum an Höflichkeit, freiwillig ein Problem möglichst kompakt und vollständig zu beschrieben, um den anderen nicht unnötig Arbeit aufzubürden. Für jede Sekunde, die du dir mit einer schlampigen Frage sparst, verursachst du ein Vielfaches davon bei Jedem (!), der die Frage verstehen will und etwas dazu sagen könnte. Wenn man schon kostenlosen Service seiner Mitmenschen in Anspruch nimmt, kann man denen doch wenigstens das Leben etwas erleichtern? Darüber, ob man das Problem auch selbst durch Eruieren hätte finden können, will ich nicht spekulieren; selbst wenn es so erscheint, kommt man halt selbst oft nicht drauf. Deshalb will ich darüber gar nicht mokieren. Ich will dir jetzt auch nicht übermäßig ans Bein pinkeln; letztlich ist dieser Vorgang irgendwo normal und kommt laufend vor. Bedauerlich finde ich es trotzdem, wenn die Zeit von hilfsbereiten, großteils ausgesprochen kompetenten Leuten (siehe z.B. die geduldigen und ausführlichen Antworten von z.B. Buchegger) gedankenlos verkonsumiert und verschwendet werden. Das musste nur mal raus, sorry. > ...
@Klaus Wachtler: > Aber davon abgesehen, daß viele Probleme mit > Nachdenken und einem brauchbaren Buch bei > etwas Bemühen gelöst oder zumindest eingekreist > werden können, ist es m.E. absolutes Minimum an > Höflichkeit, freiwillig ein Problem möglichst > kompakt und vollständig zu beschrieben, um den > anderen nicht unnötig Arbeit aufzubürden. > Für jede Sekunde, die du dir mit einer schlampigen > Frage sparst, verursachst du ein Vielfaches davon > bei Jedem (!), der die Frage verstehen will und > etwas dazu sagen könnte. Das ist nicht notwendigerweise ein Zeichen von Unhöflichkeit. Wenn ein Fragesteller genug Überblick über die Materie hätte, um seine Frage so zu stellen wie du es hier forderst, dann könnte er auch die Lösung alleine finden. Es ist normal in Webforen, dass Leute gar nicht so genau wissen, was alles zur Frage gehört. Vielleicht daran ab und zu mal denken. Gruß, tuppes
>Seine Methode funktioniert doch ausgezeichnet, es findet sich immer ein >Dummer der mehr Zeit investiert als der Frager selbst und das Problem >loest. Wirklich eine tolle Antwort. Meinst du ich würde hier noch versuchen alles klarzustellen wenn ich zu faul bin um mich damit zu beschäftigen. Oder willst du damit sagen das Karl heinz dumm ist weil er anderen Leuten hilft. Genauso wie auch ich in anderen Foren bei Sachen von den ich Ahnung habe versuche ebenso gute antworten zu geben. Anscheined hast du ja keine Fragen bei denen du nicht mehr weiterweist. >Das erste Post war völlig nichtssagend, weil nicht mal die Datentypen >zu sehen waren. Ist völlig richtig. In dem Beitrag ging es mir ja auch noch nicht um ein konkretes Problem. Ich hatte nur festegestellt das es ein unterschiedliches Ergebinis gibt wenn ich die Division in einer 2. Zeile mache und konnte mir nicht erklären warum. Ich hatte nicht daran gedacht das die Datentypen für die Beantwortung der Frage wichtig sein könnten. >Im zweiten waren ein paar Deklarationen, aber von anderen Variablen >keine Typen und/oder keine Werte. Hatte ich ja schon gesagt das ich damit nur erklären wollte warum b = -a/10 in diesem Fall nicht funktioniert. Es war schon Spät und man hätte sich klarer ausdrücken können. >Im dritten war nicht kompilierbarer Quelltext (keine #include, >fehlendes Semikolon); so hast du das bestimmt nicht übersetzt >und "getestet". >Dazu kamen dann angebliche Ergebnisse, die nicht stimmten. Ja das include hab ich weggelassen da es ja bei beiden Varianten gleich ist und ich ja nur wissen wollte wo der Unterschied bei den beiden Varianten ist. Beim 2. hab ich nur runterkopiert und dabei das ; vergessen. Ich versteh ja das es einem irgenwann auf den Sack geht wenn man anderen Leuten helfen will und dann nur unvollständige Sachen liest aber es wäre zu diesem Zeitpunkt sich hilfreicher gewesen mir zu schreiben das das include auch wichtig ist, anstatt ein "so nicht kompilierbar" mit dem ich nichts anfangen konnte da es ja bei mir funktioniert hatte. Und die Ergebnisse sind nicht angeblich sondern die, die ich rausbekommen hab. Ich mach auch gerne einen Screenshot ;) Nichtsdestotrotz wurde ja dann damit meine Frage auch schon beantwortet. >Bis hier wurde schon in 5 Antworten herumgerätselt, wo immer >noch keine belastbaren Angaben von dir da waren. Meine Frage wurde nach meinem 3. Beitrag beatwortet mit dem ich versucht habe alle Fragen zu beatworten. >Dazu kommt, daß du die ganze Zeit vermutlich hartnäckig >Compilerwarnungen einfach ignoriert hast. Nein hatte keine Warnungen. >Aber davon abgesehen, daß viele Probleme mit Nachdenken und >einem brauchbaren Buch bei etwas Bemühen gelöst oder zumindest >eingekreist werden können, ist es m.E. absolutes Minimum an >Höflichkeit, freiwillig ein Problem möglichst kompakt und >vollständig zu beschrieben, um den anderen nicht unnötig >Arbeit aufzubürden. Genaus so sehe ich das auch und ich hab ja auch nichts anders gemacht. Ich hatte das Problem soweit wies es mir möglich war eingekreist alle Informationen die mir wichtig erschienen abgegeben. Aber auch hier kann man dazulernen und wenn ich das nächste mal ein Problem hab bei dem ich nicht weiter weiß und ich mich dazu entschließe es hier zu posten dann werde ich sicher mehr dazu schreiben. >Bedauerlich finde ich es trotzdem, wenn die Zeit von >hilfsbereiten, großteils ausgesprochen kompetenten Leuten >(siehe z.B. die geduldigen und ausführlichen Antworten >von z.B. Buchegger) gedankenlos verkonsumiert und verschwendet >werden. Ich habe nicht umsonsonst nach der wirklich ausführlichen Antwort von Karl heinz nochmal nachgefragt um auch wirklich alles zu verstehen und genau solche Fragen nicht mehr stellen zu müssen. Ich bin froh das es es solche Leute gibt, und genau so gebe auch ich mein Wissen(z.B. aus 20 Jahren Motorsporterfahrung) in anderen Foren weiter. Alles in allem hätten ich sicher intelligenter Fragen können, auch wenn das alles noch neu für mich ist, aber ich denke nicht das es deshalb angebracht ist mir deshalb gleich eine Moralpredigt halten zu wollen, in der ich als fauler Lügner dargestellt werde, wenn es ein kleiner Hinweis z.B. "gib doch bitte die includes mit an" auch getan hätte.
Und jetzt auch angemeldet damit sich keiner daran stören kann das ich als Gast schreibe ;)
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.