float to string

Gast #5776
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
Admin Persönliche Seite #5777
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
Gast #5782
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
Gast #5784
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
#696504
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
#696509
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)
#696772
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
#696914
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...)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren