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