Wieso nicht immer float statt int?

9 Antworten

Nein, es funktioniert nicht genauso!

float ist ein Datentyp der seine Werte nur "ungefähr" darstellen kann, d. h. es gibt immer irgendwelche Ungenauigkeiten.

int hingegen ist exakt.

Beispiel:

float f = 0.1 + 0.1 + 0.1;
int i = 1 + 1 + 1;

Der Integer ist exakt 3, der Float-Wert hingegen ist NICHT exakt 0.3.

Je mehr, länger und öfter Gleitpunktwerte verrechnet werden, desto stärker akkumulieren sich diese Fehler, und gerade wenn du große mit kleinen Werten verrechnest, wird es sehr oft passieren, dass dein float-Wert um einige zichtausend neben dem korrekten Ergebnis liegt.

Merke dir: floats sind nur Annäherungen an korrekte Werte, werden diese aber so gut wie nie exakt darstellen können.

Wenn du dir sicher sein willst, rechne so lange wie möglich mit ints und arbeite erst ganz zum Schluss mit floats.

Aus dem selben Grunde werden Geldbeträge bei Banken auch nicht als float behandelt, sondern es wird ausschließlich mit ints gerechnet.

Woher ich das weiß:Berufserfahrung

maestrodelle 
Fragesteller
 14.12.2020, 20:16

Danke das macht sinn,

dann rechne ich zB statt mit

0.01 + 0.14 (float)

eher mit

1 + 14 (int) und setze das ergebnis danach hinters komma?

0

Grundsätzlich geht beides ja aber das rechnen mit Floats ist nicht immer all zu gut. Man muss hier beachten dass Floats aufgrund der begrenzten Genauigkeit nicht immer so intuitiv funktionieren. So kann es zB zum Effekt kommen, dass 1-1000*0.001 nicht 0 ist was es aber sein sollte. Sprich floats kann man schlecht so direkt vergleichen oder für die Programmablaufsteuerung verwenden, aus diesen Grund verwendet man hier Integer und floats verwendet man eigentlich nur wenn man einen mathematischen Algorithmus implementiert.

Auf Rechner ohne FPU ist zudem die Verwendung von float und das Rechnen damit sogar extrem langsam.

Dazu kommt dass sich floats nicht als Darstellung von Bitmustern eigenen, also das Bitmuster 101 hätte in float und Integer eine andere Darstellung.

im Grunde kann man ja auch eine Zahl ohne Dezimalstellen bei float eingeben und es funktioniert genauso oder?

zum einen wird die Bit-Folge bei einem Float intern komplett anders interpretiert. Siehe Zweierkomplement (Integer) und IEEE 754 (Float, Double)

Dann ist ein Float nicht genau, weil ein Rechner eben NUR mit Bits rechnen kann - also im Zweiersystem. Das Problem siehst du z.B. schon, wenn du z.B. 0.1 + 0.2 rechnest - das ergibt nämlich nicht 0.3, da ein Rechner nicht nativ mit dem Dezimalsystem klarkommt.

Aufgrund der Darstellung von Floats sind Rechenoperationen auch teurer / langsamer, da im Zweifelsfall auch die Mantisse und der Exponent umgerechnet werden müssen.

Direktes Rechnen mit Bitoperatoren sind auch nur eingeschränkt möglich

Dann ist es bei manchen Anwendungen einfach nur unnötig, siehe z.B. Schleifen. Du hast ja nur ganze Durchläufe und kannst nicht sagen, dass du jetzt 2.5 Schleifendurchläufe willst

Ja, beispielsweise Rundungsfehler, Genauigkeiten, Ranges und die Tatsache, dass Int-Berechnungen und -Vergleiche grundsätzlich viel schneller sind als Floating-Point-Operationen.

Fliekommazahlen heißen nicht aus Spaß so. Die 'Datenmenge' für Vor- und Nachkommaanteil ist sozusagen flexibilisiert (Die Zahl der signifikanten Stellen bleibt gleich, bedenke was das für sehr große und sehr kleine Zahlen bedeutet). Aber insbesondere gilt, daß Nachkommastellen in der Regel zur Basis 2 dargestellt werden, was wiederum bedeutet, daß dezimale Nachkommastellen oft nicht exakt abgebildet werden können.

(Versuche 1/3 als Dezimalzahl darzustellen, wenn Du nur eine begranzte Anzahl von Stellen hast - ähnliches passiert bei der Darstellung von Dezimalnachkommastellen bei binären Floats.)

Leider ist es nicht allzu intuitiv, wann solche Abbildungsprobleme auftreten, aber wenn sie es tun, haben sie bei Vergleichen etc. weitreichende Konsequenzen, derer man sich im Vorfeld sehr bewußt sein muß.

Dazu kommt, daß Float-Operationen teuer sind, selbst wenn es eine FPU gibt - zumindest gemessen an Integralwert-Arithmetik.