Forum: Compiler & IDEs float to string


von Bernd (Gast)


Lesenswert?

hallo,

hat jemand eine code um einen float in eien string umzuwandeln. sprintf 
unterstützt das leider nicht.

Bernd

von gabby (Gast)


Lesenswert?

Hallo Programmers,
ich habe eine C-Funktion geschrieben,
die ein Float in einem ascii String umwandelt.
Bis zu 4 Stellen vor dem Komma und 3 Stellen hinter dem Komma. Kann auf 
mehrere  oder wenigere Stellen angepasst werden, zwecks 
Genauigkeit/Schnelligkeit
Wer Floatzahlen auf einem Display anzeigen oder per Uart senden will, 
braucht sowas. Es gibt noch keine
fertig implementierte ftoa Funktion in AVRGCC.

Verkaufe den Source-Code für 10 EURO, der beliebig in eigenen Projekte 
benutzt werden darf und natürlich nicht weitergegeben werden darf.

Wenn ein bisschen Geld zusammen kommt, werde ich die Funktion hier 
umsonst posten. Ich brauche die Funktion selber nicht und habe gesehen, 
daß viele sowas brauchen; hab also die Zeit dafür extra investiert. Da 
viele Programmierer hier meistens für
Firmen arbeiten, denke ich sind die 10 EURO kein Problem...man hockt 
bestimmt mehr wie 1 Stunde dran... auch ansonsten lohnt sich diese Zeit 
zu sparen, wenn man überhaupt weisst wie man sowas machen kann.

Es sind 2 Funktionen, eine die einen Pointer auf ein String zurückgibt 
und eine die nichts zurückgibt,hier kann der Code zum Anzeigen an 
Display/Uart eingefügt werden. Als Parameter bekommt man eine Float 
Zahl. Die Funktion ist
Speed optimiert.

void  ftoa(float );
char *ftoa(float );

Bestellungen per email an
gabby@everymail.net

Gruss, Gabby

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Du verlangst 10 Euro für eine ftoa()-Funktion für die du eine Stunde 
gebraucht hast? Wieviel Geld war das doch gleich das du für die vielen 
tausend Stunden bezahlt hast die in AVR-GCC stecken?

Sorry, ich finde das asozial. Wenn man was von der "Community" nimmt, 
sollte man auch bereit sein etwas zurückzugeben, und wenn es nur sowas 
vergleichsweise mickriges wie ftoa() ist.

just my 2 cents
Andreas

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Die Diskussion erübrigt sich sowieso - AVR-GCC hat bereits eine 
komfortable Funktion zur Umwandlung von Float nach String: dtostrf(), 
siehe 
http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual.pdf.gz

von BAB (Gast)


Lesenswert?

also die folgenden sind da...aber nicht die dtostr().

itoa()
ltoa()
ultoa()

von BAB (Gast)


Lesenswert?

p.s: gabby kannst dir deine lib verkauferei sparen...wenn bei gcc 
wirklich keine da ist werde ich in den nächsten tagen eine schreiben und 
hier posten...

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Lad dir die aktuelle Version der avr-libc runter 
(http://savannah.nongnu.org/download/avr-libc/snapshots/), da sollte 
dtostr() dabei sein!

Andreas

von Norbert (Gast)


Lesenswert?

Also, um meine Float-Werte über UART auf's Display auszugeben, benutze 
ich innerhalb des printf-Befehls den Konvertierungs-Spezifizierer %f.
Diverse Formatierungen sind möglich: Stellenanzahl, Unterdrückung 
vorlaufender Nullen, Stellen hinter dem Komma etc.

Kennt AVR-GCC %f nicht?  Naja, CodeVision kennt's auch nur vorläufig.



Norbert

von BAB (Gast)


Lesenswert?

danke andreas hab sie gefunden..werde die lib mal testen...

von Sebastian__ (Gast)


Lesenswert?

Hallo,
kann mir bitte jamend verständlich erkläre wie ich die 4 dateien 
installieren soll (die 4 unter Source tar balls habe ich runtergeladen), 
ich habe die GCC version von der AvrFreaks seite drauf (Win32 build of 
avr-gcc 3.2,  [11M] June.25, 2002)

da ich mit C und GCC noch nich so viel zu tun hatte tue ich mich da ein 
bischen schwer.
oder nennt mir ne quelle wo ausfürlich beschrieben is wie was in welcher 
reihenfolge zu tun is.

Danke schon mal :-)

Sebastian

von BAB (Gast)


Lesenswert?

findest du alles auf dieser seite und bei http://www.avr-freaks.net

von BAB (Gast)


Lesenswert?


von Alexander H. (ill_son)


Lesenswert?

Hi,

als ich denn (Werbe)Beitrag für die ftoa-Funktion gelesen habe, dachte 
ich erst an einen Scherz. Leute gibt's...

Aber mal ein anderes Problem´: wenn ich die dtostrf benutze, rundet 
werden die nachkommastellen immer gerundet. Bsp.:

float tmp = 5,345;
string[20];

dtostrf(tmp,1,3,string);  //liefert dann 5.000

weiß jemand, woran das liegt?

Habe 'nen ATMEGA32 und die aktuelle WINAVR-Version.

Gruß, Alex

von Karl H. (kbuchegg)


Lesenswert?

Alexander Heß wrote:
> Hi,
>
> als ich denn (Werbe)Beitrag für die ftoa-Funktion gelesen habe, dachte
> ich erst an einen Scherz. Leute gibt's...
>
> Aber mal ein anderes Problem´: wenn ich die dtostrf benutze, rundet
> werden die nachkommastellen immer gerundet. Bsp.:
>
> float tmp = 5,345;

Mach da mal einen Komma-*punkt* hinein :-)

 float tmp = 5.345;

Das Perverse daran ist nämlich, dass dein Code absolut lupenreines
C ist. Nur macht es nicht das was du denkst :-)

   float tmp = 5, 345;

Der Kommaoprator wertet seine Argumente von links nach rechts aus.
Das Endergebnis ist das Ergebnis vom am weitesten links stehenden
Ausdruck. Im Grunde hast du einfach geschrieben:

   float tmp = 5;

(da ja der zweite Ausdruck, 345, nichts sinnvolles macht)

von Alexander H. (ill_son)


Lesenswert?

Vielen Dank für den Tip. Das eklärt zumindest, warum nur Mist rauskam, 
als ich die Formatierung ausprobiert habe.Es gibt da allerdings noch ein 
Problem. In meinem eigentlichen Quellcode wird die Variable nicht auf 
diese Weise fest belegt, sondern ergibt sich aus einer Berechnung.

unsigned short tmp;
float f_erg;

f_erg = tmp*20/4096;
dtostrf(f_erg,2,3,sting);

Trotzdem wird das Ergebnis immer auf ganze Zahlen gerundet.

Liegt das vielleicht daran, das tmp eine Integer Variable ist?
Müsste ich vielleicht

f_erg = (float)tmp*20.0/4096.0

oder so ähnlich schreiben??? Bin da noch nicht ganz so fit.

Gruß, Alex

von Johannes M. (johnny-m)


Lesenswert?

Alexander Heß wrote:
> Liegt das vielleicht daran, das tmp eine Integer Variable ist?
Bei der obigen Berechnung ja.

> Müsste ich vielleicht
>
> f_erg = (float)tmp*20.0/4096.0
>
> oder so ähnlich schreiben??? Bin da noch nicht ganz so fit.
Im Prinzip ja, aber die Typkonversion mit "(float)" kannste Dir sparen, 
wenn wenigstens einer der Operanden als Gleitkommawert gekennzeichnet 
ist (also mit ".0" am Ende). Es wird in Deinem Fall auch keinesfalls 
"gerundet", sondern es wird eine Ganzzahl-Division durchgeführt und der 
Rest "weggeschmissen".

Du solltest Dir aber auch dringendst mal den Artikel zur 
Festkommaarithmetik ansehen. Gerade Deine Berechnung schreit 
förmlich danach (überleg v.a. mal, was eine Division durch 4096 
eigentlich ist...)

von Alexander H. (ill_son)


Lesenswert?

>(überleg v.a. mal, was eine Division durch 4096
> eigentlich ist...)

zwölf Mal rechts shiften? ;-)

Werd mal Deinem Hinweis nachgehen und etwas lesen.

Danke und Gruß, Alex

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.