D a v i d K. schrieb:
> A. S. schrieb:
>> Für Rechnungen ist es wichtig zu wissen, ob ein int 2 oder 4 Byte hat.
> Worauf willst du hinaus?
Google mal nach "Integral Promotion". Dadurch funktioniert es halt bei
uint16 nicht.
Aber warum beantwortest Du die Frage nicht trotzdem einfach?
D a v i d K. schrieb:
> #define FIXPOINT_MOVEMENT 1000UL
> void calibration(uint16_t given_l, uint16_t should_l, uint16_t given_h,
> uint16_t should_h, uint16_t *a, int32_t *b) {
> uint32_t delta_given = given_h - given_l;
> uint16_t delta_measured = should_h - should_l;
> *a = divideCommerciallyRound(FIXPOINT_MOVEMENT * delta_given,
> delta_measured);
> //*b = FIXPOINT_MOVEMENT * given_l - a should_l;
> *b = 1000 * given_l - (int32_t )(a should_l);
> }
Es wird deutlich einfacher, wenn Du dich auf int16 beschränken kannst.
Dann werden alle Vorzeichen richtig behandelt.
Wenn dann Differenzen auftreten können, die außerhalb des Wertebereichs
liegen, dann musst Du entweder casten, oder nacheinander rechnen oder
eine (dummy-)0 als Long einfügen.
a) int32_t d=(uint32_t)g_h-g_l;
b) int32_t d=g_h; int32_t-=g_l;
c) int32_t d=0L + g_h - g_l;
Wenn bei dir _h immer größer ist als _g, braucht das nicht. klar.
Bei der (auskommentierten) Formel reicht entsprechend auch eine Dummy 1
als Long
*b = FIXPOINT_MOVEMENT * given_l - 1L*a * should_l;