f.f=0.000000000000000006 : Debug f

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

f.f=0.000000000000000006 : Debug f

Beitrag von AND51 »

Code: Alles auswählen

f.f=0.000000000000000006
Debug f
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... :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: f.f=0.000000000000000006 : Debug f

Beitrag von ts-soft »

AND51 hat geschrieben:

Code: Alles auswählen

f.f=0.000000000000000006
Debug f
Debugger hat geschrieben:Zeile 1: Numeric overflow, too big number
Ist das nicht lolIg??
Nein, ist PB-Version < 4 :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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? :wink:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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? :D
Und, und, und...
Ansonnsten, suchfunktion ... du bist ja nicht der erste, der dannach Fragt
:wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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
Heroglyph
Beiträge: 41
Registriert: 22.11.2004 20:34

Beitrag von Heroglyph »

Du wirst lachen, aber genau so werden sie gespeichert, nur zur Basis 2 und mit ein paar Tricks.
God is real, unless declared integer.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Antworten