Seite 1 von 2
f.f=0.000000000000000006 : Debug f
Verfasst: 19.05.2006 16:45
von AND51
Debugger hat geschrieben:Zeile 1: Numeric overflow, too big number
Ist das nicht lolIg??
Und könnt ihr mir, bzw. allen anderen Lesern nicht ein paar Infos über den Datentyp Float geben? Die Hilfe reicht mir da nicht unbedingt. Warum wird, wenn ich in eine Floatvariable 1 speichere, immer
1.0000000 debuggt? Und warum nimmt man nicht gleich nur FLoat- sondern standardmäßig immer noch Integer-Variablen? Und wie sieht es mit dem Speicherverbrauch aus? Und, und, und... Halt alles, was ihr wisst und preisgeben möchtet...

Re: f.f=0.000000000000000006 : Debug f
Verfasst: 19.05.2006 16:52
von ts-soft
AND51 hat geschrieben:Debugger hat geschrieben:Zeile 1: Numeric overflow, too big number
Ist das nicht lolIg??
Nein, ist PB-Version < 4

Verfasst: 19.05.2006 17:12
von AND51
OK, das hatte ich vergessen zu erwähnen, aber du hast die Fakten gnadenlos und knallhart aufn Tisch gepackt.
Aber wo bleiben dir Infos?

Verfasst: 19.05.2006 17:19
von ZeHa
Floats sind so 'ne Sache für sich... da ist es schwer, kurz und knackig ein paar Infos rauszugeben.
Floats werden in den meisten Fällen ungenau gespeichert, sprich, Du kannst sie für Geld-Beträge oder sowas nehmen, aber sobald es kritischer wird (also mehr Stellen nach dem Komma) kann es zu Problemen kommen. Beispielsweise kann es auch mal sein, daß Du zwei Float-Werte miteinander vergleichst, die eigentlich nach Deinen Vorstellungen gleich sein müßten, es aber letztendlich dennoch nicht sind und somit "false" zurückkommt, weil z.B. die eine 1,000000 ist und die andere 0,9999999 (und dennoch als 1,0000 ausgegeben wird) etc.
Da mußt Du Dich echt mal ein wenig umschauen, so 100%ig kann ich Dir auch keine Infos geben. Aber warum Integer noch verwendet werden, liegt daran, daß man schneller damit rechnen kann, weil sie eben 1:1 abgebildet werden (bei Floats wird ja erst ein wenig rumgerechnet) und weil es eben damit keine solchen Genauigkeits-Probleme gibt wie oben beschrieben. Außerdem braucht man ja in vielen Fällen eh nur Ganzzahlen.
Verfasst: 19.05.2006 17:23
von PMV
Warum wird, wenn ich in eine Floatvariable 1 speichere, immer 1.0000000 debuggt?
Weil fred zu faul war, den Debugger vorher für dich testen zu lassen, wie
viel stelle nach dem komme sinnvoll sind, aus zu geben ... wie wäres mit
StrF().
Und warum nimmt man nicht gleich nur FLoat- sondern standardmäßig immer noch Integer-Variablen?
Weil Float viel zu ungenau ist ... für die meisten sachen sind Ganzzahlen
ausreichend und dann sollte man auch die entsprechenden Variablen
nehmen. Du willst mir ja wohl nicht weis machen, das du mehr
Fließkommazahlen hast als Ganzzahlen ... vorallem wo du anscheinend
noch nichts drüber weist

.
Und wie sieht es mit dem Speicherverbrauch aus?
also das steht eindeutig in der Hilfe ... was soll man sonnst noch dazu
sagen?
Und, und, und...
Ansonnsten, suchfunktion ... du bist ja nicht der erste, der dannach Fragt
MFG PMV
Verfasst: 19.05.2006 17:34
von Zaphod
die fakten gibt es auf wikipedia
http://de.wikipedia.org/wiki/Gleitkommazahl
Warum sollte man eine Gleitkomma Zahl benutzen wenn man ein integer möchte?
Offensichtlich sind viele operatonen auf gleitkomma zahlen anders/unsinnig/arbeitsintensiver. Was ist die genaue iteration von 0.1? Etwa 1.1? 0.2? 0.11?
Wenn ich zwei floats vergleiche muß ich immer mit tolleranz arbeiten statt einfach direkt auf gleichheit zu prüfen.
Wenn du dich nun fragst, warum jemand einen datentyp einfach ungenau implementiert stell dir mal folgende Fragen:
Wieviele reelle zahlen gibt es zwischen 0 und 1? richtig abzählbar unendlich viele.
Ist die anzahl an Speicherzellen in deinem pc unendlich? Diesseits des multiversums wohl nicht. Hm, dann haben wir mit reellen zahlen wohl ein problem.
Offensichtlich kann man die nämlich nicht genau auf endliche hardware abbilden. Da muß wohl ein approximatives verfahren herhalten... und das führt zu ungenauigkeiten.
Verfasst: 19.05.2006 17:36
von AND51
Aha, da ist man doch gleich schon schlauer, danke! Auch der Tipp mit den Integerzahlen. Kurz und knapp muss es nicht sein, wenn jemand einen kleinen Roman verfassen möchte, bitte sehr! Es ist ja nicht nur für mich, sondern soll auch anderen dienen, auch wenn ich jetzt danach frage.
Verfasst: 19.05.2006 20:08
von hardfalcon
Ich frage mich allerdings, weshalb flots nicht einfach ein paar Bits größer als normale Integers sind, und dass dieser Speicherbreich dann in 3 Teile aufgesplittet wird:
- 1 Bit für Zeichen (falls es ein Signed-Typ sein soll)
- ein paar Bits um die Position des Kommas festzulegen
- den ganzen Rest an Bits um die Zahl als Integer zu speichern
Verfasst: 20.05.2006 02:30
von Heroglyph
Du wirst lachen, aber genau so werden sie gespeichert, nur zur Basis 2 und mit ein paar Tricks.
Verfasst: 20.05.2006 03:08
von ZeHa
Ich frage mich allerdings, weshalb flots nicht einfach ein paar Bits größer als normale Integers sind
Das hängt auch mit der CPU-Architektur, Bus-Breite usw. zusammen. Momentan benutzt man halt gerne 4 Byte, für Int, Float, Adressen usw., und durch die 64 Bit-Systeme werden bald 8 Byte für solche Dinge benutzt (wobei ich nicht sicher weiß, ob das dann auch für Floats gelten wird).
Für doppelte Genauigkeit gibt's ja Doubles, aber meistens braucht man die doch gar nicht. Notfalls kann man auch einfach alle Berechnungen mit Zahlen machen, die eigentlich 1000x größer sind als die tatsächlichen, und nur bei der Ausgabe (wo meist eh gerundet wird) dann durch 1000 teilen etc.