German Addition ungenau, warum?

pjo12345

Active Member
Licensed User
Longtime User
B4X:
Dim i, k As Float
   i=3.9
   k=0
   k=k+i
   Log(k)

Warum ergibt das: 3.9000000953674316 und nicht 3.9 oder 3.9000000000000000?

mfg pjo12345
 

klaus

Expert
Licensed User
Longtime User
Du solltest die Variablen als Double dimensionieren anstatt Float
Float sind 32 Bit Zahlen.
Double sind 64 Bit Zahlen also genauer.
Die Ungenauigkeit kommt leider davon dass nicht alle Dezimalzahlen nicht genau in Binärzahlen umgewandeld werden können.
In manchen Systemen werden die Zahlen abgerunded und sehen daher genau aus.
Zum Anzeigen kann man NumberFormat oder NumberFormat2 verwenden um die Zahlen abzurunden.

Wenn Ich mich richtig erinnere werden in B4Android Float Zahlen zuerst in Double umgewandelt bevor sie als String angezeigt werden.

Beste Grüsse.
 
Last edited:

Jost aus Soest

Active Member
Licensed User
Longtime User
Wer misst, misst Mist!

...würde man in der Messtechnik sagen. ;)

Um das von Klaus richtig gesagte noch zu illustrieren...

Wenn man Float benutzt, bekommt man auch nur Float, also 32 Bit. Dies entspricht - je nach gewählter interner Darstellung - ungefähr 8 Ziffern, was man auch unmittelbar am Beispiel (3.9000000953674316) erkennen kann: Die ersten 8 Ziffern stimmen genau!

Alle weiteren Ziffern sind halt im Rahmen der "Messungenauigkeit"...

Daher sollte man bei Gleitkommazahlen auch nicht auf Gleichheit testen, sondern auf Ähnlichkeit. Also nicht so:
B4X:
If aFloat = bFloat Then
Sondern besser so:
B4X:
If Abs(aFloat - bFloat) < 0.00001 Then
 

pjo12345

Active Member
Licensed User
Longtime User
Ich habe jetzt Double genommen. Funktioniert.

Danke....

mfg pjo12345
 
Top