Alexander Foken: FLOAT Problem

Beitrag lesen

Moin Moin !

Zwei Floats sind gleich, wenn der Absolutbetrag ihrer Differenz kleiner als eine sehr kleine, aber noch als Float darstellbaren Zahl Epsilon ist.
Ok, aber im PHP-Manual steht dass, FLOAT normalerweise auf 14 Nachkommastellen genau rechnet.

Ach ja?

123456789012345678901234567890123456789012345678901234567890.12345678901234

ist für PHP also noch von

123456789012345678901234567890123456789012345678901234567890.12345678901235

zu unterscheiden? Ich glaube nicht.

0.2800000000000000000
0.2800000000000000001
0.2799999999999999999

Alle drei Zahlen werden als 0.28 angezeigt.

Ich habe 10, also was kann da schief gehen?

Die Langfassung? => Numerik I.

Ist es ein Unterschied ob ich 0.2800000000 - 0.0100000000 rechne, oder 0.28 - 0.01?

Nein. Aber wenn der Computer rechnet, arbeitet er mit Exponent und Mantisse, und da geht schonmal was verloren. Dezimale Zahlen lassen sich generell nicht exakt in binäre Zahlen mit Exponent und Mantisse umrechnen. Ausnahmen bestätigen die Regel.

const epsilon = 1.0e-10;

function float_equal(float a, float b)
{
  if (abs(a-b)<epsilon) {
    return 'equal'
  } else {
    return 'not equal'
  }
}

Oder meinst Du ich soll den Vergleich mit eben dieser Funktion durchführen?

Mit einer sehr ähnlichen. Überlege, wann die Differenz zwischen zwei FLOATs für Deinen Anwendungsfall zu vernachlässigen ist -- oder nimm 1e-10.

Alexander

--
Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"