mikrocontroller.net

Forum: Compiler & IDEs float to string


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

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

Bernd

Autor: gabby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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/a...

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also die folgenden sind da...aber nicht die dtostr().

itoa()
ltoa()
ultoa()

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Andreas

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke andreas hab sie gefunden..werde die lib mal testen...

Autor: Sebastian__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BAB (Gast)
Datum:

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

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Alexander H. (ill_son)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Alexander H. (ill_son)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...)

Autor: Alexander H. (ill_son)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.