Forum: Mikrocontroller und Digitale Elektronik Fließkommarechnung mit Atmega8 funktioniert nicht


von Mani (Gast)


Lesenswert?

Hallo!

Ich habe ein Problem undzwar, hab ich folgendes in AVR-GCC für den 
Atmega8 Programmiert:
Bsp:

float test;
float test2;

test=1/2*1000;
test2=1000/2;

eigentlich sollte bei beiden das gleiche rauskommen, allerdings kommt 
bei "test" 0 raus und bei "test2" kommt 500 raus.

dasheißt das 1/2 rechnet er mit 0 einfach, aber genau deshalb hab ich ja 
float gewählt das er auch kommastellen habe.

Hat jemand ne Idee wieso das nicht funktioniert?

Vielen Dank

Mani

von sunday morning (Gast)


Lesenswert?

Hallo,

er scheint die zahlen ganz eindeutig als Ganzzahlen zu behandeln.

Das würde das Ergebnis erklären:
denn 1000 / 2 = 500
und 1 /2 = 0 * 1000 = 0 (wuerde Integer maessig auch so passen)

Deshalb multipliziert man auch zuerst bei Integer Zahlen und dividiert 
dann.
1
test=1/2*1000;
2
test2=1000/2;

Vielleicht musst du die Benutzung von float noch irgendwo aktivieren? 
Aber bist du dir sicher, dass du auf einem 8 Bit Controller mit 
Fliesspunkt KOmma Rechnen willst? Das ist sehr rechenintensiv.

Such mal nach Fixpoint!

Schönen Sonntag noch :-)

von Johannes M. (johnny-m)


Lesenswert?

Mani wrote:
> test=1/2*1000;
> test2=1000/2;
Das auf der rechten Seite vom "=" sind alles ganze Zahlen, und 
dementsprechend werden die auch als solche behandelt. Wenn in einem 
anderen Datentyp gerechnet werden soll, dann muss man mindestens einen 
der beteiligten Werte als Gleitkommazahl schreiben.
1
test=1/2.0*1000;
Allerdings sollte man sich bei der Anwendung von Gleitkommaoperationen 
immer bewusst sein, dass da viele Ressourcen draufgehen. In den meisten 
Fällen ist man mit Festkommaarithmetik besser bedient.

BTW:
Es heißt Gleitkomma und nicht "Fließkomma" (engl. to float: gleiten)

von Mani (Gast)


Lesenswert?

Perfekt Leute VIELEN VIELEN DANK!!!

Hätte mir einiges an sucherei gestern gespart, bin einfach nicht drauf 
gekommen Danke!!!

Das ich Festkomma statt Gleitkomma verwenden sollte, ist schon klar, ich 
brauch aber unbedingt Gleitkomma ... Leider :(

Danke nochmals!

Mani

von Mani (Gast)


Lesenswert?

Das Problem ist, nämlich ohne Fließkomma würde ich auf 650000 kommen, 
und das ist selbst für einen unsigned long long zu viel :(
Gibts keine variablendeklaration die auch mehr als unsigned long long 
hat?

von Mani (Gast)


Lesenswert?

Ok, sorry unsigned long bzw. unsinged long long reichen natürlich 
vollkommen aus

Nur komischerweise funktioniert zwar long long aber long alleine reicht 
ned obwohl long ja um vieles mehr als 260000 hat.

von Dirk als (Gast)


Lesenswert?

???
Wo ist das Problem, schon unsigned long geht bis 4.294.967.295

von Gaston (Gast)


Lesenswert?

@Johannes M.

Anm deiner Aussage stimmen zwei Sachen wohl nicht:
>BTW:
>Es heißt Gleitkomma und nicht "Fließkomma" (engl. to float: gleiten)

Erstmal ist es nicht Gleitkomma, sondern sehr wohl Flieskomma
emgl. floating-point und Gleiten wäre in engl. glide.

Im übrigen könnte man auch einen C Compiler eine Flieskommazahl bekannt 
machen, in dem man einfach ein f inter der Zahl dranhängt z.B. :

test=1/2f*1000;

Grützli

von Dirk (Gast)


Lesenswert?

>Erstmal ist es nicht Gleitkomma, sondern sehr wohl Flieskomma
>emgl. floating-point und Gleiten wäre in engl. glide.


Wenn man keine Ahnung hat...

Natürlich heißt to float auf Deutsch gleiten.
Fliessen heisst auf Englisch to flow.

Und sehr wohl heisst das auf Deutsch Gleitkommazahl...

von Gast (Gast)


Lesenswert?

>Natürlich heißt to float auf Deutsch gleiten.
>Fliessen heisst auf Englisch to flow.

Seit wann müssen wir unsere Sprache aus dem Englischen ableiten?

Das "macht" doch keinen Sinn, das "macht" keinen Unterschied, nicht 
"wirklich", ...
Equal goes it loose.
Ach 'so etwa's gan's Wichtige's habe ich noch verge's'sen!

von Machtnix (Gast)


Lesenswert?

eben und deswegen sind sich da auch alle (un)einig was floating point 
nun bedeutet

h**p://www.dict.cc/?s=floating+point <- die müsstens wissen schätze ich
oder auch nicht und was wie so weshalb :-P

von Johannes M. (johnny-m)


Lesenswert?

Um fließen zu können, müsste das Komma (bzw. der Punkt) erst mal flüssig 
sein. Man sollte auch mal über den Sinn eines Begriffes nachdenken. 
dict.leo.org sagt übrigens auch etwas anderes. Dort wird "to float" 
nirgends mit "fließen" übersetzt, was eigentlich auch korrekt ist. "to 
float" heißt eben gleiten, treiben, schwimmen usw. Die Übersetzung mit 
"fließen" ist im Prinzip schlicht falsch und rührt vermutlich 
tatsächlich von der Ähnlichkeit mit "to flow" her, was tatsächlich 
"fließen" heißt.

Gaston wrote:
> Im übrigen könnte man auch einen C Compiler eine Flieskommazahl bekannt
> machen, in dem man einfach ein f inter der Zahl dranhängt z.B. :
>
> test=1/2f*1000;
Man könnte das auch so machen. In diesem Falle führen selbst in C 
mehrere Wege nach Rom. Allerdings ist mein Lösungsvorschlag ebenfalls 
völlig korrekt.

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.