Forum: Mikrocontroller und Digitale Elektronik sprintf %f geht nicht


von hake (Gast)


Lesenswert?

Hallo, ich nutze AVR-Studio mit WINAVR.

Code:
...
sprintf(s,"adc:%f\r\n",2.88);
uputs(s);
...




Ausgabe:

adc:?

Wo ist das Problem? Ich verzweifle hier noch...

von tset (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio 
pauschal würde ich sagen, lass dass mit den floats und lies dir den 
Artikel Festkommaarithmetik durch.
Außerdem solltest du dir angewöhnen mehr Code zu zeigen, in mit den 
Möglichkeiten der Foren-Software zu formatieren und vor allem sollte der 
Code kompilierbar sein. Rest siehe Netiquette.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

tset schrieb:
> pauschal würde ich sagen, lass dass mit den floats

Pauschal würde ich sagen, dass pauschale Aussagen Unfug sind. ;-)

Gleitkommazahlen haben einen unbeschreiblichen Vorteil: eine recht
gute Dynamik, sodass man gerade während der Prototypenphase damit erst
einmal schnell zu einem Ergebnis kommt.  Ihre Darstellung entspricht
dem, was wir als normale Zahlendarstellung benutzen, der Debugger kann
sie einem direkt anzeigen.  Wenn man also 1.55 für eine Variable
sieht, dann weiß man, dass da soeben 1,55 V gemessen worden sind,
während das für 0x0623 nicht so offensichtlich ist.  Außerdem muss man
sich erstmal nicht um irgendwelche Zahlenbereichsüberläufe und
dergleichen kümmern.

Wenn der Algorithmus erst einmal steht, und man mit ihm nicht
zufrieden ist (zu viel Speicherverbrauch, zu lange Rechenzeit, zu
geringe Genauigkeit), kann man sich allemal an die Optimierung mittels
Festkommaarithmetik machen.

Ehrlich gesagt, verstehe ich diesen Hype "Nimm ja nicht auf keinen
Fall überhaupt jemals keine Gleitkommazahlen auf so einem kleinen
Controller!" nicht.  Controller, die größer als der Ur-AT90S1200 sind,
sind schon lange erfunden, und deren Mehrpreis (im Vergleich zum
kleinsten möglichen Controller) liegt selbst nach Maßgaben eines
Hobbybudgets in der Regel kaum bei einer Stunde Arbeitszeit -- und die
hat man ganz schnell durch die Bequemlichkeit wieder rein.

Wenn man für richtig große Stückzahlen entwickelt, ist das natürlich
was anderes, aber wen von uns hier betrifft das denn wirklich?

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

hake schrieb:
> sprintf(s,"adc:%f\r\n",2.88);

Ich bin mir jetzt nicht sicher, meine aber, dass standardmäßig eine 
kastrierte printf-Routine verwendet wird, die nicht alle Optionen 
unterstützt. Man kann aber mittels Schalter, o.ä. die große Version 
aktivieren.

von tset (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> tset schrieb:
>> pauschal würde ich sagen, lass dass mit den floats
> Pauschal würde ich sagen, dass pauschale Aussagen Unfug sind. ;-)
Pauschal würde ich sagen, dass man an einem Zweizeiler nicht viel 
erkennen kann, also kann zumindest ich dann nur pauschale Aussagen 
treffen und da stehe ich zu 'wenn moeglich kein float auf einem AVR'. 
;-)
Zu dem Rest deines Beitrags: ich habe auf den Artikel 
Festkommaarithmetik hingewiesen, um zu entscheiden, ob float oder nicht, 
hat er jetzt schon einiges zum Lesen.

Ich hätte ja auch
1
s[]="2.88\r\n";
2
uputs(s);
schreiben können, wäre bei dem, was man aus dem Zweizeiler sehen kann, 
auch richtig gewesen. ;-)

von tset (Gast)


Lesenswert?


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.