Forum: Compiler & IDEs INT TO DOUBLE funktioniert nicht


von Ed M. (edmu)


Lesenswert?

Hallo Leute

ich habe ein Problem mit der Umsetzung von Integer in Double.
Hier mein Code:
1
  int16_t solldrehzahl;
2
  double drehz_takt;
3
4
5
  solldrehzahl = 123;
6
  drehz_takt = solldrehzahl / 10.0;

Ich benutze AVR-Studio 4.12 und einen ATMega 162.
Der Fehler macht sich bemerkbar, dass die LED's am Controller nicht 
richtig
blinken, bzw. meine Betriebs-LED zu langsam blinkt. Ausserdem 
funktioniert meine UART nicht mehr.

Ändere ich den Code in ...
1
  int16_t solldrehzahl;
2
  double drehz_takt;
3
4
5
  solldrehzahl = 123;
6
  drehz_takt = 333 / 10.0;  //<<<<<<<<<<<<

... funtioniert alles wieder einwandfrei.

Wo ist das Problem bei der Umsetzung. Ich habe schon viele Foren 
durchgewühlt und bei Google geschnüffelt, habe dementsprechend auch was 
am Code verändert, aber ohne erfolg.
Zum Rechnen brauche ich aber Komma-Zahlen.

Danke

von STK500-Besitzer (Gast)


Lesenswert?

>Zum Rechnen brauche ich aber Komma-Zahlen.

Das bezweilfe ich.
Guck mal nach Festkommaarithmetik

von Roland P. (pram)


Lesenswert?

Du musst die solldrehzahl explizit nach double casten
1
 drehz_takt = (double)(solldrehzahl) / 10.0;
... aber trotzdem würd ich nach Möglichkeit nicht mit Doubles (auch 
wenns bequem ist) rechnen sondern wie schon gesagt, mit 
Festkommaarithmetik

Gruß
Roland

von Peter D. (peda)


Lesenswert?

Ed M. schrieb:
> blinken, bzw. meine Betriebs-LED zu langsam blinkt. Ausserdem
> funktioniert meine UART nicht mehr.

Dann hast Du wohl zuviel SRAM verbraucht (Strings im SRAM?).

Die standard float Lib verbraucht 264 Byte SRAM, Du mußt den 
Linkerschalter -lm angeben.

Außerdem, double kann der AVR-GCC nicht, er macht float daraus.


Peter

von edmu (Gast)


Lesenswert?

danke für die Antworten

Mein SRAM ist bei ca. 75%, zumindest wird das beim Übertragen mit 
PonyProg angezeigt.
Strings benötige ich nicht.
1
Die standard float Lib verbraucht 264 Byte SRAM, Du mußt den
2
Linkerschalter -lm angeben.
Wo muss ich dieses einschalten?
1
Außerdem, double kann der AVR-GCC nicht, er macht float daraus.

Ich habe es auch schon mit FLOAT gemacht, hatte aber auch keinen erfolg.
1
drehz_takt = (double)(solldrehzahl) / 10.0;
funktioniert auch nicht.


mfg Edmu

von Kai G. (runtimeterror)


Lesenswert?

>Du musst die solldrehzahl explizit nach double casten
> drehz_takt = (double)(solldrehzahl) / 10.0;

Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste 
sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder 
entscheidet der sich bei C für den Typ des linken Operators?

von Karl H. (kbuchegg)


Lesenswert?

Kai Giebeler schrieb:
>>Du musst die solldrehzahl explizit nach double casten
>> drehz_takt = (double)(solldrehzahl) / 10.0;
>
> Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste
> sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder
> entscheidet der sich bei C für den Typ des linken Operators?

Nein.
Der 'Tip' war einfach nur Quatsch.

Ich denke mal, dass -lm (wie von PeDa beschrieben) das Problem löst oder 
aber der TO hat einen anderen Bug im Programm, bei dem er sich den 
Speicher so zerschiesst, das sich das beschriebene Problem zeigt.

von Mark B. (markbrandis)


Lesenswert?

Karl heinz Buchegger schrieb:
> Ich denke mal, dass -lm (wie von PeDa beschrieben) das Problem löst oder
> aber der TO hat einen anderen Bug im Programm, bei dem er sich den
> Speicher so zerschiesst, das sich das beschriebene Problem zeigt.

Sorry for off-topic, aber: Was heißt eigentlich TO? Thread-Originator?

von Benedikt K. (benedikt)


Lesenswert?

edmu schrieb:

> Mein SRAM ist bei ca. 75%, zumindest wird das beim Übertragen mit
> PonyProg angezeigt.

Das glaube ich nicht, denn dazu müsste Ponyprog das Programm 
analysieren, was es nicht kann. Du meinst vermutlich den Flash.

von Karl H. (kbuchegg)


Lesenswert?

Mark Brandis schrieb:

> Sorry for off-topic, aber: Was heißt eigentlich TO? Thread-Originator?

Thread Opener

In deutschen Foren ist auch OP gebräuchlich: Originaler Poster

von Roland P. (pram)


Lesenswert?

Karl heinz Buchegger schrieb:
> Kai Giebeler schrieb:
>>>Du musst die solldrehzahl explizit nach double casten
>>> drehz_takt = (double)(solldrehzahl) / 10.0;
>>
>> Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste
>> sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder
>> entscheidet der sich bei C für den Typ des linken Operators?
>
> Nein.
> Der 'Tip' war einfach nur Quatsch.

Stimmt natürlich. 10.0 ist ja schon ein double (bzw. Float)
Was anderes wäre es, wenn man 2 Integer-Variablen dividiert. Hier ist 
der Cast nach double erforderlich (falls man nicht auf 
Festkommaarithmetik zurückgreift)

Also ich tipp auch darauf (nach nochmaligen Lesen des OP), dass die 
Floatlib den Speicher zumüllt. Ein
1
drehz_takt = 333 / 10.0;  //<<<<<<<<<<<<
funktioniert vermutlich deshalb, weil der Wert schon zur Compilezeit 
berechnet wird.

Gruß
Roland

von edmu (Gast)


Lesenswert?

ich habe mich jetzt doch dazu entschlossen, die festkommaarithmetik zu 
nehmen.

trotzdem vielen dank für eure hilfe

edmu

von Mark B. (markbrandis)


Lesenswert?

Karl heinz Buchegger schrieb:
> Mark Brandis schrieb:
>
>> Sorry for off-topic, aber: Was heißt eigentlich TO? Thread-Originator?
>
> Thread Opener
>
> In deutschen Foren ist auch OP gebräuchlich: Originaler Poster

Hm, www.acronymfinder.com meint dazu:

OP  Original Poster (internet newsgroups and message boards)

Scheint also nicht auf deutsche Foren beschränkt zu sein :-)

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.