Beim rechnen an den Überlauf gestoßen

OP #2502540
Lesenswert?

Hallo,
ich will folgendes machen:
1
int16_t x, y, z;
2

3
x = 29;
4
y = -260;
5
z = 20;
6

7
//ausgabe auf RS232
8
put_string(itoa(sqrt((x^2)+(y^2)+(z^2)), msg, 10));

Da kommt nicht das Richtige raus.

Das ist ein Problem mit dem Überlauf, richtig?

Versuchsweise:
1
//ausgabe auf RS232
2
put_string(itoa((x^2)+(y^2)+(z^2), msg, 10));

Ausgabe: -206

Wie mache ich das richtig?
(Atmega 8)

Tschüss muebau
OP #2502804
Lesenswert?

Hallo,
es ist gut zu sehen das es hier Fachkundige gibt.
Oben zu sehendes Verhalten ist aber blamabel!

Sollte jemand die Lösung brauchen und ebenfalls mit dem Versuch nach "^" 
zu suchen auf Probleme stoßen, hier ein sinnvoller Beitrag:

^ ist ein Bitweises exklusives Oder

die richtig Lösung hier:
1
pow( .. , ..);

@Peter II
Vielen Dank.

MfG
muebau
Persönliche Seite #2503180
Lesenswert?

Fridolin Onteca schrieb:

> pow( .. , ..);

Das willst du nicht wirklich, weil das die Zahler in double umwandelt 
(gleichbedeutend mit float in avr-gcc).

Alse einfach x*x hinschreiben, auch wenn's nicht so toll aussieht wie 
pow...
1
#include <stdint.h>
2

3
uint32_t hypot2 (uint16_t x, uint16_t y, uint16_t z)
4
{
5
    return (uint32_t) x*x + (uint32_t) y*y + (uint32_t) z*z;
6
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren