www.mikrocontroller.net

Forum: Compiler & IDEs Float nach Int Konvertierung funktioniert nicht ?


Autor: Roger Koller (roschee)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich moechte eine Berechnung machen und verwende dazu einen float typ.--> 
siehe auch Dateianhang.

Anschliessend moechte ich diesen in Int umwandeln, damit ich ihn dann in 
der ltoa() Funktion verwenden kann.

Folgenden Forum Vorschlag 
Beitrag "Float nach Int / Ascii"
wollte ich dazu zu Hilfe nehmen.

Leider kommt auf meinem Display nur fuer den Fall dass A_beat kleiner 
wie 3448 ist immer -1 raus.
Nun weiss ich aktuell nicht, wo das Problem liegt ?

Habt Ihr eine Idee ?

Gruss

Roger

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Roger Koller wrote:
> Hallo,
>
> ich moechte eine Berechnung machen und verwende dazu einen float typ.-->
> siehe auch Dateianhang.
>
> Anschliessend moechte ich diesen in Int umwandeln, damit ich ihn dann in
> der ltoa() Funktion verwenden kann.
>
> Folgenden Forum Vorschlag
> Beitrag "Float nach Int / Ascii"
> wollte ich dazu zu Hilfe nehmen.
>
> Leider kommt auf meinem Display nur fuer den Fall dass A_beat kleiner
> wie 3448 ist immer -1 raus.
> Nun weiss ich aktuell nicht, wo das Problem liegt ?
>
> Habt Ihr eine Idee ?

Dann divisiert du 60 durch 0, weil A_beat/3448 = 0 ist, denn A_beat ist 
long.

Caste auf float oder dividiere durch 3448f.

Johann

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     temp = (60/(A_beat/3448));

     temp = (60.0/((float)A_beat/3448.0));

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Roger Koller wrote:
> Habt Ihr eine Idee ?

Ganz ehrlich? OK:
Fließkommazahlen sind schlicht und einfach wie eine Seuche. Jeder Depp 
(nicht persönlich nehmen, bitte) will sie haben, aber keiner ist bereit, 
sich mal mit ihren Grundlagen zu beschäftigen.
Und ja, selbst moderne computergesteuerte Sternwarten kommen heute 
problemlos ohne Fließkomma aus.

Also: Skaliere den Kram herauf, berechne deine Sachen möglichst klug 
(überlege dir, in welcher Reihenfolge die Teilrechnungen am besten 
erledigt werden, sodass sich möglichst viel rauskürzt und du keine 
Überläufe riskierst). Danach das Komma richtig setzen und bingo.
Stichwort: Scaled Integer. Warum mit 0,004 Metern rechnen, wenns mit 4 
Millimetern genauso geht?

Den Fließkommadreck kann man benutzen, wenn man nicht von vorneherein 
weiß, welche Dimensionen die Werte annehmen, da sie einerseits einen 
großen Bereich, andrerseits diesen aber lückenhaft und ungenau abdecken.

Autor: Roger Koller (roschee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. wrote:
> Roger Koller wrote:

>
> > Also: Skaliere den Kram herauf, berechne deine Sachen möglichst klug
> (überlege dir, in welcher Reihenfolge die Teilrechnungen am besten
> erledigt werden, sodass sich möglichst viel rauskürzt und du keine
> Überläufe riskierst). Danach das Komma richtig setzen und bingo.
> Stichwort: Scaled Integer. Warum mit 0,004 Metern rechnen, wenns mit 4
> Millimetern genauso geht?
>

Ich bin davon ausgegangen, dass bei jedem Dividieren eine Gleitkommazahl 
automatisch entsteht und deswegen habe ich den float typ gewaehlt.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne, Fließkomma kommt nur raus, wenn du auch Fließkomma reinsteckst.
Und trotzdem: Hochskalieren, rechnen, runterskalieren. Geht schneller, 
ist berechenbarer.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich bin davon ausgegangen, dass bei jedem Dividieren eine Gleitkommazahl
>automatisch entsteht und deswegen habe ich den float typ gewaehlt.

Tut sie aber nicht ;)

Schreib den Kram mal um:

>     temp = (60/(A_beat/3448));

     temp = ((60 * 3448) / A_beat);

Dann brauchst du auch kein float mehr.

Autor: Roger Koller (roschee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. wrote:

>
> Dann divisiert du 60 durch 0, weil A_beat/3448 = 0 ist, denn A_beat ist
> long.
>
> Caste auf float oder dividiere durch 3448f.
>
> Johann

Hallo Johann,

mit dem Kommentar "weil A_beat/3448 = 0 ist" bin ich etwas verwirrt.
Mir ist schon klar das A_beat ein long ist, aber wieso spielt dies bei 
der Diffision hier eine Rolle. Ich denke die Berechnung wird unter Temp 
abgespeichert oder zwischengespeichert, bis die Berechnung vollstaendig 
fertig ist. Das hier A_beat mit ins Spiel kommt, habe ich noch nicht 
verstanden.
Koenntest Du mir das etwas ausfuehrlicher erlauetern.

Im voraus schon meinen besten Dank


Gruss

Roger

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>mit dem Kommentar "weil A_beat/3448 = 0 ist" bin ich etwas verwirrt.

Angenommen A_beat ist 3447

3447/3448 ist Null bei Ganzzahldivision.

60/0 ist? Undefiniert!

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Roger Koller wrote:

> Ich bin davon ausgegangen, dass bei jedem Dividieren eine Gleitkommazahl
> automatisch entsteht und deswegen habe ich den float typ gewaehlt.

Assumption is the mother of all f uckups.

Es wird Zeit, dass du dir ein C-Buch durchliest.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     temp = ((60 * 3448) / A_beat);

Upps, Fehler gefunden!

  temp = ((60UL * 3448) / A_beat);

Autor: Roger Koller (roschee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger wrote:
>>     temp = ((60 * 3448) / A_beat);
>
> Upps, Fehler gefunden!
>
>   temp = ((60UL * 3448) / A_beat);

Was bedeutet das UL ?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Roger Koller wrote:
> holger wrote:
>>>     temp = ((60 * 3448) / A_beat);
>>
>> Upps, Fehler gefunden!
>>
>>   temp = ((60UL * 3448) / A_beat);
>
> Was bedeutet das UL ?
Castet das Dingen auf 'unsigned long'. Dadurch wird '60*2448' auch auf 
'unsigned long' erweitert und das Ergebnis passt.

Autor: Roger Koller (roschee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

gibt es irgendwo ein gutes Buch oder Internetseite, wo man all
diese Feinheiten wie UL findet und erklaert bekommt.
Ich kann ein wenig C programmieren, aber die meisten Fehler passieren 
wie ich auch bei anderen Leuten im Forum gesehen haben Aufgrund von 
falschen Typisierungen.
Aber dies ist meiner Meinung nach das A und O beim Programmieren. Bei 
meinen Programmier Versuchen, wende ich staendig die Try und Error 
Methode an um ueberhaupt auf einen gruenen Zweig zu kommen, da meistens 
der Code was anderes macht, was ich will, was aber Hauptsaechlich an den 
falschen Typen oder flascher Verwendung der Typen zu tun hat.


Vielleicht muesste man diesen Punkt ( Typen  und Anwendung ) mal als 
eigenes Kapitel auf der Mikrocontroller Seite einrichten.


Gruss

Roger

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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

Bewertung
0 lesenswert
nicht lesenswert
Roger Koller wrote:

> Ich kann ein wenig C programmieren, aber die meisten Fehler passieren
> wie ich auch bei anderen Leuten im Forum gesehen haben Aufgrund von
> falschen Typisierungen.

Nein.
Die meisten Fehler passieren, weil die meisten Leute glauben sie könnten 
eine Programmiersprache ohne vernünftige Unterlagen lernen. Ein paar 
Schlüsselwörter ohne Tippfehler hinzuschreiben zu können ist noch nicht 
mal 5% der Programmierung.
Man kann ohne Fremdsprachenkenntnisse, nur mit einem Wörterbuch 
bewaffnet, in ein fremdes Land fahren und dort so einigermassen 
zurechtkommen. Aber nur deswegen, weil die Einheimischen dort mitdenken 
und zu erraten versuchen was du willst, wenn du ihnen Wörter vorwirfst. 
Ein Computer denkt nicht mit, er macht das was du ihm sagst. Und wenn du 
zwar die Wörter in fast der richtigen Reihenfolge benutzt, aber die 
Regeln der Sprache nicht beachtest, dann macht er zwar etwas, aber nicht 
das was du gerne hättest.

> Aber dies ist meiner Meinung nach das A und O beim Programmieren.

Das A und O der Programmierung ist, das man sein Handwerk beherrscht. 
Und zwar von den Grundlagen weg.

> der Code was anderes macht, was ich will, was aber Hauptsaechlich an den
> falschen Typen oder flascher Verwendung der Typen zu tun hat.

Wenn du damit dann endlich mal klarkommst, hast du noch nicht mal 10% 
dessen, was du als gestandener Programmierer können musst. 
Basis-Datentypen, ihre Verwendung und nach welchen Regeln sie 
verarbeitet werden, sind absolute Grundlagen. Da wartet noch vieles auf 
dich.

> Der Klassiker K&R:

Kriegt auch meine Stimme. Mit einem K&R im Regal ist man fürs Erste mal 
gut ausgestattet.
Ein Buch hat gegenüber einem Online-Tutorial ein paar unschätzbare 
Vorteile:
* Du kannst es immer in Griffweite bereit halten
* Du kannst es neben deinen Programmierübungen neben der Tastatur 
aufgeschlagen lassen
* Klassiker wie K&R sind weitgehend fehlerfrei, was man von vielen 
Online Tutorials nicht gerade behaupten kann
* Du kannst dir für dich wichtige Stellen markieren
* Man braucht keinen Browser
* In den meisten Fällen sind sie viel umfangreicher als Online-Tutorials
* Sie wurden von vielen Programmierern gelesen. Wenn du also eine Frage 
dazu hast, findet sich immer wer, der den Klassiker gelesen hat und den 
einen oder anderen Punkt schnell erläutern kann. Eben weil er das selbst 
schon mal durchgearbeitet hat.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Kürzel "K&R" steht mittlerweile sogar im Abkürzungs-Duden :)

Noch ein Tip: K&P (Kernighan & Pike) "The Practice of Programming"
http://cm.bell-labs.com/cm/cs/tpop/index.html

CU

PS: Nochwas von Pike http://herpolhode.com/rob/ugly.pdf

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.