Forum: Mikrocontroller und Digitale Elektronik Beim rechnen an den Überlauf gestoßen


von Fridolin O. (muebau)


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
von Peter II (Gast)


Lesenswert?

Fridolin Onteca schrieb:
> Wie mache ich das richtig?

int16_t -> int32_t

(schnell wird das ganze aber nicht)
von Stefan E. (sternst)


Lesenswert?

Fridolin Onteca schrieb:
> Das ist ein Problem mit dem Überlauf, richtig?

Das größere Problem ist aber, dass du wohl nicht weißt, was ^ in C 
bedeutet.
von Fridolin O. (muebau)


Lesenswert?

Stefan Ernst schrieb:
> Fridolin Onteca schrieb:
>> Das ist ein Problem mit dem Überlauf, richtig?
>
> Das größere Problem ist aber, dass du wohl nicht weißt, was ^ in C
> bedeutet.

Wirst du es auch verraten?
von Noname (Gast)


Lesenswert?

>Wirst du es auch verraten?
Wirst Du es nachlesen?
von vorgekaut damit man es hier nachlesen kann (Gast)


Lesenswert?

^ ist ein xor, googlestichwort bitoperator c
von Thomas E. (thomase)


Lesenswert?

Fridolin Onteca schrieb:
> Wirst du es auch verraten?
Das steht in jedem C-Buch. Du kannst es aber auch erraten.

Weil heute Sonntag ist:
Das "^" ist in C der bitweise Exklusiv-Oder-Operator.

Quadrieren musst du mit x = square(x); oder x = x * x;

mfg.
von Fridolin O. (muebau)


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
von Fridolin O. (muebau)


Lesenswert?

Hallo,
vielen, vielen Dank.

Ihr wart schneller.

Tschüss muebau
von Johann L. (gjlayde) Benutzerseite


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