Fließkommarechnung mit Atmega8 funktioniert nicht

Gast #1122985
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
Gast #1122991
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 :-)
#1122995
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)
Gast #1123013
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
Gast #1123017
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?
Gast #1123020
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.
Gast #1123037
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
Gast #1123043
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...
Gast #1123055
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!
Gast #1123130
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
#1123159
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.

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