Genau, es ist der Cosinussatz! Umgeformt nach dem Winkel und mit 1024 multipliziert. Das arccos habe ich hier mal ausgelassen, da es nichts mit dem Problem zutun hat, dass es einen Integer-overflow gibt.
Der Code (für die rechnung) sieht folgendermaßen aus:
Die Warnung wird meißt nur dann angezeigt, wenn man die Konstanten direkt in die Rechnung einsetzt, wenn sie als Variablen eingesetzt werden, dann gibt es (fast immer) keine Warnungen.Code:char buf[7]; uint8_t us = 150, os = 130, d123 = 151; //d123 ist eigentlich unterschiedlich, die Berechnung ist aber //etwas kompilzierter, und tut nix zur Sache. itoa(((int32_t)((us*us)+(os*os)-(d123*d123)))*1024/(2*us*os), buf, 10); //anschließend buf ausgeben
Wenn ich diese Rechnung mit dem PC ausführe, dann liefert sie das richtige Ergebniss 435, mit dem AVR bekomme ich -640 bei raus.
Ich hätte gedacht, dass das Problem ist, dass z.B. us*us größer ist, als ein signed int (16bit) speichern kann (ist es aber nicht). d123 könnte aber groß genug werden... . Wie kann ich dieses Problem beheben? habe (wie zuvor schon gepostet) auch versucht, jede einzelne Klammer in uint16_t zu casten. Hat anscheinend was gebracht, aber immer noch nicht genug. Es wird anstatt 2 overflows dann nur noch einer vom compiler angezeigt.
Die Rechnung wird dann allerdings richtig ausgeführt (zumindest mit diesen Werten). Das Problem ist damit trotzdem nicht gelöst.
Gruß, Yaro







Zitieren

Lesezeichen