Das ist worauf ich hinaus wollte! Das Problem scheint aber nicht all zu bekannt zu sein. Mir ist das erst vor kurzem untergekommen.
Hab mittlerweile auch einen Artikel dazu gefunden.
https://www.elektronikpraxis.de/verglei ... -a-657052/
Jetzt kommt aber nochmals die Frage auf, warum man davon üblicher weise nichts weis und warum das dann nicht wenigstens in Programmiersprachen standardmäßig integriert ist! Noch besser wäre eigentlich eine Rundung auf Genauigkeit gleich im Prozessor.
ich hab hier jetzt noch mal eine Code gebastelt, der das Problem mit dem Floatvergleich mit Epsilopn 2e-7 zeigt. Das geht nur für Werte < 4.0
Code: Alles auswählen
; EPSILON und TINY aus Fortran Codes für diverse numerische Methoden
; EPSLON = 0.0000001
; Eps = 0.0000001
; TINY=1.0e-20
; TINY=1.e-25
; EPS=1.e-6
; EPS=3.e-7 MIN=1.e-30
; EPS=6.e-8
; EPS=1.e-10
; TINY=1.5e-38
; TINY=1.69e-38, SQRTNY=1.3e-19, BIG=3.E37
; EPS=1.2e-7
; EPS=3.e-8
; EPS=1.e-7, TOLMIN=1.e-6
; EPS=1.e-14
; EPS=3.e-14
; EPS=3.e-8
; und in einem Programm war das automatisch geregelt mit MachineFloatPrecsion
EnableExplicit
Procedure.d FloatPrecision()
Static.f FPr
; IT CARRIES OUT AN APPROXIMATION OF MACHINE PRECISION
FPr = 1.0
While (1.0 + FPR) > 1.0
FPr = 0.5 * FPr
Wend
ProcedureReturn FPr * 2.0
EndProcedure
Define eps.f ;
eps = FloatPrecision()
eps = 2e-7 ; Test mit festem Epsilon: für automatisch berechnet, diese Zeile auskommentieren!!!!
Debug "eps = " + StrF(eps,20)
Define.i I
Define.f n, x
n = 1
For I = 0 To 16
x = n + eps
If x = n
Debug Str(I) + " : für n = " + StrF(n,1) + " ist (n + eps) = n"
Else
Debug Str(I) + " : für n = " + StrF(n,1) + " ist (n + eps) <> n"
EndIf
n * 2
Next
Was da rauskommt scheint die Precision von doubles zu sein.
Wenn man Epsilon automatisch berechnen lässt und das dann auf eine Float Zahl addiert ändert sich diese nicht.
Das ermittelete Epsilon ist also viel zu klein. Wie kann das sein?