Forum: Mikrocontroller und Digitale Elektronik rechnfehler mit standartrechnung uint32_t


von Christian (Gast)


Lesenswert?

programm rechnet falsch, bin ich zu blöd oder was? :-)


#include "suart.h"
#include "string.h"
#include "sms.h"
#include <stdint.h>

volatile uint32_t min=0;
char zahl_buffer[7];

uint32_t getMinuten()
{
  stunde=1;
  monat=1;
  minute=1;
  jahr=0;
  min=1+(1*60)+(1*30*60*24)+(1*365*24*60);
  return min;
}


ergebnis: 4294946333 anstatt: 568861

von B. S. (bestucki)


Lesenswert?

Christian schrieb:
> min=1+(1*60)+(1*30*60*24)+(1*365*24*60);

Lass mich raten: Die Berechnung wird in int durchgeführt und der ist auf 
deiner Plattform 16 Bit breit. Es kommt zum Überlauf und anschliessend 
wird die negative Zahl in einen uint32_t gecastet, was in einer grossen 
Zahl resultiert.

von (prx) A. K. (prx)


Lesenswert?

Der Typ der linken Seite einer Zuweisung hat keinerlei Einfluss auf die 
Rechnung auf der rechten Seite.

von Christian (Gast)


Lesenswert?

hallo Be Stucki, ich habe extra alle variablen entfernt. die 
zielvariable kommt direkt nach uint32t: min und trotzdem habe ich das 
falsche ergebnis.

komisch.

von rmu (Gast)


Lesenswert?

an der stand-art liegts sicher nicht.

was für eine platform ist das? anscheinend ist dort int nur 16bit gross, 
dann rechnet er also in 16 bit int, und interpretiert das am schluss als 
uint32_t, da kommt dann genau das raus.

häng an die zahlen "ul" an, dann gehts ohne überlauf.

von Bernd (Gast)


Lesenswert?

> programm rechnet falsch

Das Programm rechnet überhaupt nicht. Es ist unvollständig.

> bin ich zu blöd oder was? :-)

Dem ersten Teil kann ich nur zustimmen :)

von Christian (Gast)


Lesenswert?

ich programmiere einen atmega16.

von B. S. (bestucki)


Lesenswert?

Christian schrieb:
> hallo Be Stucki, ich habe extra alle variablen entfernt. die
> zielvariable kommt direkt nach uint32t: min und trotzdem habe ich das
> falsche ergebnis.
1
uint32_t WertA = 1; /* 1 ist ein int */
2
uint32_t WertB = INT_MAX * INT_MAX; /* das Ergebnis ist ein int */
3
uint32_t WertC = 1U; /* 1 ist ein unsigned int */
4
uint32_t WertD = UINT32_C(1) /* 1 ist 32 Bit breit */

Genau hier liegt dein Problem. Eine Zahl ist erstmal ein int. Wird damit 
gerechnet, ist es immernoch ein int. Ist das Ergebnis zu gross für einen 
int, gibts ein Überlauf, das Ergebnis ist immernoch ein int. Du als 
Programmierer bist dafür verantwortlich, dass das Ergebis und auch alle 
Zwischenergebnisse einer Berechnung mit dem jeweiligen Datentyp 
repräsentierbar sind. Schau dir dazu die integer promotions an.

Christian schrieb:
> ich programmiere einen atmega16.

Dann ist dein int 16 Bit breit und ich habe richtig geraten.

: Bearbeitet durch User
von Christian (Gast)


Lesenswert?

danke Bernd für die bestätigung, danke rmu für den tipp, das ergebnis 
stimmt jetzt. also auf atmega16 keine 32bit zahlen?

von (prx) A. K. (prx)


Lesenswert?

Christian schrieb:
> also auf atmega16 keine 32bit zahlen?

Doch. Aber nicht automatisch.

von Christian (Gast)


Lesenswert?

danke Be Stucki! :-) nun komme ich weiter super!!!

von Wolfgang (Gast)


Lesenswert?

Christian schrieb:
> programm rechnet falsch, bin ich zu blöd oder was? :-)

Du bist nicht mal in der Lage, einen fehlerfreien Thread-Titel zu 
schreiben. Vier Fehler in vier Worten ist eine stolze Leistung.

von Karl M. (Gast)


Lesenswert?

Christian,

doch Du musst nur 1ul oder 1uul schreiben.
Und nun rate mal wo das steht ?
In einem C Buch - die Standard.

Man könnte auch zur besseren Übersicht jede erste Zahl Casten:
1
((uint32_t)1..)

von Christian (Gast)


Lesenswert?

hallo Wolfgang meine oma hat zu mir gesagt: du kanns bloed sein so viel 
du willst, du must dir nur zu helfen wissen. lg

von Karl M. (Gast)


Lesenswert?

Christian,

was soll ich von deinen Fähigkeiten halten, wenn man das neurale Element 
der Multiplikation - die 1 - in eine Multiplikation auch schreibt ?
Ok, den Präprozessor wird das nicht interessieren, aber dort stehen nur 
Konstanten, die kann man auch selbst als Ausdruck hinschreiben.

von (prx) A. K. (prx)


Lesenswert?

Karl M. schrieb:
> was soll ich von deinen Fähigkeiten halten, wenn man das neurale Element
> der Multiplikation - die 1 - in eine Multiplikation auch schreibt ?

Da es sich offensichtlich um einen verkürzten Beispielcode zur 
Illustration des Problems handelt ist diese Kritik hier fehl am Platz.

> Ok, den Präprozessor wird das nicht interessieren

Solltest du zu jenen gehören, die der Ansicht sind, dass der 
Präprozessor irgend etwas mit hier relevanten Teil des Codes zu tun hat, 
dann solltest du lieber selber mal das C Handbuch studieren und über die 
Rolle des Präprozessors nachdenken.

: Bearbeitet durch User
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.