Forum: Mikrocontroller und Digitale Elektronik Einfache Division von zwei float / double Werten


von Torsten B. (torty)


Lesenswert?

Hallo Gemeinde

Kann mir bitte kurz jemand erklären, warum das hier im AVR Simulator 
nicht klappt..

void Division (void)
{
  volatile double Dezi = 0.0;  //vol nur für Simulator
  volatile double dummy = 0.0;  //vol nur für Simulator


  dummy = atof("53.34565");

  Dezi = 60 / dummy;         //<--- ?!?!?!?!
}

Das die Funktion zweckfrei ist weiß ich.
Warum kann ich die Division nicht ausführen.
Ob es im uC klappt, kann ich noch nicht sagen. Im Simulator (2) geht es 
nicht.

Grüße
Torsten

von Uwe (de0508)


Lesenswert?

Hallo,

ganz einfach "60" ist eine ganze Zahl (Integer), die Division erfolgt 
also mit ganzen Zahlen. Das Ergebnis ist bestimmt 60 / 53 = 1, oder ?

von Torsten B. (torty)


Lesenswert?

Nee klappt auch mit 60.0 nicht.

Meinte aber auch
  Dezi = dummy / 60.0;

der SImulator steigt einfach aus ...
Im Watch Fenster ist Dezi dann "Not in scope"

von Ingo (Gast)


Lesenswert?

Was geht denn nicht?


Ingo

von Ingo (Gast)


Lesenswert?

Und wenn du einen Cast devor packst? Auf einem AVR geht sowas 
jedenfalls...


Ingo

von Benjamin U. (utzus)


Lesenswert?

Hast du eine Optimierung eingeschaltet? Vl hat der Compiler alles 
wegoptimiert.

von Torsten B. (torty)


Lesenswert?

Dezi = (float) dummy / 60.1;
hatte ich auch schon.
Gleicher Effekt.

Was passiert ? ....
Der gelbe Pfeil vom Simulator verschwindet, obwohl unten rechts 
"stopped" steht.
Im Disassembler Fenster springt er in einen Bereich, der "File not 
found" heißt.
Hab aber nicht genug Ahnung, um das zu deuten.

von Torsten B. (torty)


Lesenswert?

hat sich erledigt.
Das Problem lag mal wieder zwischen den Ohren des Users.
Wenn ich mit F11 durchgehe macht er immer nur einen Schritt weiter.
Die Division braucht aber 1388 Schritte !!!
Mit F10 geht er drüber weg und liefert das Ergebnis

Sorry.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Torsten B. schrieb:
> Im Watch Fenster ist Dezi dann "Not in scope"

Direkt nach "Dezi = dummy / 60.0;" steht eine schließende geschweifte 
Klammer, das heißt, die Prozedur ist an dieser Stelle zu Ende, und die 
lokalen (!) Variablen der Prozedur sind nicht mehr im "Blickfeld".

Deklarier doch Dezi mal als globale Variable (außerhalb der Prozedur).

Unabhängig davon kann es trotzdem sein, dass dein Programm komplett 
"wegoptimiert" wurde, wie Benjamin schon schrieb. Ein Schlauer Compiler 
merkt, dass der Code Unsinn ist, weil die Variablen später nicht mehr 
verwendet werden. Bei "volatile" sollte das aber eigentlich nicht 
passieren...

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.