Forum: Compiler & IDEs Division liefert falsches Ergebnis


von Kottan (Gast)


Lesenswert?

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

von ich (Gast)


Lesenswert?

evtl. überlaufproblem

warum nicht
b = -a/10

von Kottan (Gast)


Lesenswert?

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;

von Klaus W. (mfgkw)


Lesenswert?

und was ist rev? a_rev?

von Stefan E. (sternst)


Lesenswert?

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

von Thomas K. (muetze1)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

und vielleicht auch eine dürre Angabe dazu, wie der "Mist" aussieht,
der rauskommt und wie er riecht?

von Kottan (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

so nicht kompilierbar

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

@Kottan ermittelt:
was erwartest du eigentlich als "richtig", wenn du eine unsigned mit 
einer negativen Zahl multiplizierst?

von Kottan (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Kottan (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> sollte man dir eigentlich dein Lehrbuch solange um die Ohren dreschen,
> bis nur noch Fetzen davon übrig sind.
Von den Ohren?  LOL  :-)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Kottan (Gast)


Lesenswert?

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!

von Kottan (Gast)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

> ...

von tuppes (Gast)


Lesenswert?

@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

von Kottan (Gast)


Lesenswert?

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

von Adolf B. (kottan)


Lesenswert?

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