ValF() ??

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: ValF() ??

Beitrag von The_Dark_Zim-.- »

Bin ich nu doof oder ist PB nichtmal in der Lage den Wert 0.1 zu verwalten -.-

Code: Alles auswählen

test.f = 0.1

Debug test
Ergibt bei mir :"0.10000000149012"
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: ValF() ??

Beitrag von GPI »

Das sind einfache Umrechnungsfehler. Wir rechnen mit der Basis 10, Purebasic mit der Basis 2. Wenn dir andere Programmiersprachen "korrekt" was anzeigen, dann haben sie einfach gerundet.

Das Problem hast du auch in unser 10er-System. Probier mal da bitte 1/3 ausführlich zu schreiben. Geht nicht. In einen Zahlensystem mit der Basis 3 wärs einfach: 0.1
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: ValF() ??

Beitrag von DarkDragon »

The_Dark_Zim-.- hat geschrieben:Bin ich nu doof oder ist PB nichtmal in der Lage den Wert 0.1 zu verwalten -.-

Code: Alles auswählen

test.f = 0.1

Debug test
Ergibt bei mir :"0.10000000149012"
Sag mir halt mal wie du diese Zahl in Zweierpotenzdarstellung darstellen würdest.

0.1 ist halt
2^(-4) + 2^(-5) + 2^(-8) + 2^(-9) + 2^(-12) + 2^(-13) + ...

Und jeder Exponent dieser Summanden steht in der Mantisse für ein Bit. Man benötigt also unendlich viele Bits zur Darstellung dieser Zahl.

Code: Alles auswählen

#MAXIMUM = 256 ; Müsste aber unendlich sein
Resultat.f = 0.0 ; Angenommen unendlich viele Bits

For k = 4 To #MAXIMUM Step 4
  Resultat + Pow(2, -1 * k) + Pow(2, -1 * (k + 1))
Next k

; Leider kämen wir hier nie an:
Debug Resultat
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: ValF() ??

Beitrag von CSHW89 »

Hi The_Dark_Zim-.-

fließkommazahlen sind immer so ne sache. es gibt aber einige möglichkeiten, bei denen man sie gar nicht benötigt. wenn du z.b. ein wert in € speichern willst, speichere ihn einfach in cent. dann brauchst du keine kommazahlen, sondern nur ganzzahlen.
also wenn du die maximale anzahl an nachkommastellen weißt (wie bei €-beispiel: 2), dann würd ich immer ganzzahlen verwenden:

Code: Alles auswählen

#MULTI = 100

zahl.i = 0.15 * #MULTI

Debug StrD(zahl / #MULTI, 2)
ansonsten, eigentlich sind kommazahlen recht genau, vorallem double. hier mal ein beispiel:

Code: Alles auswählen

a.d = 0.1
Debug a

b.d = a*10
Debug b
b ist jetzt auch nicht 1.00...001

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ValF() ??

Beitrag von STARGÅTE »

Auch wenn dir das nicht gefallen wird:
Es geht beim programmieren (zumindest wenn es nicht direkt um exakte Mathematik geht) nicht um Genauigkeit, sonden nur um Geschwindigkeit.

Floats stellen halt eine der einfachsten Formen da, eine "beliebige" Dezimalzahl in genau 4Bytes darzustellen und damit zu rechnen.

Im übrigen sollte dir auch folgender Sachverhalt klar sein:

Code: Alles auswählen

Wert.f = 123400000
NeuerWert.f = Wert + 1
Debug NeuerWert
"Höö, PB kann nicht mal Eins addieren ?"
Nein! (nicht in dieser Situation!)

Die genaugikeit einer Float beträgt ca 7 bis 8 Stellen
Zu dem Zeitpunkt wo Wert.f = 123400000 gesetz wird, würde eine addition mit 1 außerhalb der genauigkeit liegen.
Gleiches Trift hier zu:

Code: Alles auswählen

Wert.f = 1
NeuerWert.f = Wert + 123400000
Debug NeuerWert
Sobald ich ich eine sehr große zahl addiere, gehen Werte davor die außehalb der Genauigkeit liegen verloren.

Das ganze resultiert natürlich aus der Darstellungsform, wie ihn meine Vorposter erklärt haben.

Das ganze mag dir nun schlimm vorkommen, ist aber schnell und auch durchaus physikalisch sinnvoll.
Misst du eine Strecke in km (1000000mm) ist eine Addition um 1mm völlig unbedeutend!
Trotzdem kannst du 1mm mit 4 multiplizieren und erhältst dort wiederum genaue 4mm.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: ValF() ??

Beitrag von The_Dark_Zim-.- »

Das Problem ist das ich eine hohe genauigkeit brauche... Ich muss im momment Werte berechnen wie z.B. 0,80537844119906700000 * 5224212E-10
Aus 5224212E-10 kann man zwar noch gut eine ganze Zahl machen und bei der Darstellung einen String verwenden, in den man dann nachträglich ein Komma an die richtige Stelle einsträgt. Blos kann man das Rechnen knicken.
Im momment wird das ganze in Excel gerechnet, aber normal müsste sich dann auch Excel verrechnen :?

Vllt. hat ja einer von euch ne Idee :|
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: ValF() ??

Beitrag von CSHW89 »

ok, kannst dir ja mal meine include angucken. sie ermöglicht rechnungen mit beliebig großen und kleinen zahlen. und sie werden im 10-system berechnet und nicht im 2-system. vielleicht hilfts ja. aber eins sei gesagt, auch hier können zahlen wie 1/3 oder PI nicht genau angegeben werden. das sind auch nur nährungswerte. sie können aber mit mehr speicherplatz genauer angegeben werden.

http://www.purebasic.fr/german/viewtopi ... =8&t=22466

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: ValF() ??

Beitrag von GPI »

The_Dark_Zim-.- hat geschrieben:Im momment wird das ganze in Excel gerechnet, aber normal müsste sich dann auch Excel verrechnen :?
Excel nimmt komplett andere ROutinen zur Berechnung her. Da wird garantiert mit der Basis 10 gerechnet, was aber den Nachteil hat, das es deutlich langsamer ist.

Auch weis ich nicht, ob sie da überhaupt Floats einsetzen, weil Fließkommazahlen sind immer eins: Schätzwerte - Egal welche Basis man hat. (Stargate hat ein schönes Beispiel mit +1 gebracht). Das sollte man sich immer bewußt machen.

Auch ist die Frage, wie genau die Ergebnisse sein müssen. In der Physik gibts ganze Unterrichtstunden, die sich mit den Thema beschaffen. Wenn deine Messwerte bspw. auf eine Stelle genau ist, dann brauchst du das Verrechnete Ergebnis nicht auf 10 Stellen angeben.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: ValF() ??

Beitrag von The_Dark_Zim-.- »

Hab mir nu was fertig gemacht. Weil er die Werte eh als String rein holt, lass ich ihn das wie in der Grundschule Zahl für Zahl ausrechnen :P
Und das ist so schnell das es nicht stört. Wenn ich es ausgibig getestet hab kann ich es ja mal Posten.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten