PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : float zahlen vergleichen



JAF
21-11-2006, 07:42
hallo,

ich habe eine komplizierte anwendung in php geschrieben,
habe nun aber das problem beim vergleichen von floatzahlen.

ich habe bereits beim lesen meiner C-buecher gelesen, dass es hierbei oft
probleme geben kann, kann mir jemand sagen warum das manchmal funktioniert,
aber manchmal nicht, obwohl die kommastellen usw gleich sind (oder gleich zu sein scheinen)?

in pruefe sie auch nicht mit ($float==$float), sondern mit in_array.
hat jemand eine idee wie ich das umgehen kann? (ausser z.b. in int umwandeln usw)

mfg jaf

Turbohummel
21-11-2006, 08:55
Hallo,

in_array() tut auch nichts anderes wie
foreach($array as $feld) {
if($float1 == $float2)
}

Problem stellen die "Rundungsfehler" dar. Ich hatte auch schon eine Anwendung, die auf meinem AMD Turion funktioniert hat, auf meinem Server (Duron 800) aber nicht.
Ich habe das so gelöst: $float1 darf nicht mehr als 0,0001% von $float2 abweichen, dann werden sie als gleich angesehen.
Je nach Anwendung ist das natürlich kritisch zu sehen.
.NET und mono bieten eine korrekte Gleitkommarechnung, die jedoch auch entsprechend langsam ist.

JAF
21-11-2006, 10:02
.NET und mono?

wie funktioniert das bzw. ist das im normalen php dabei?

mfg jaf

Romanday
22-11-2006, 12:15
Ich habe das so gelöst: $float1 darf nicht mehr als 0,0001% von $float2 abweichen, dann werden sie als gleich angesehen.

Damit sollte es gehen. (ungetestet)
bccomp -- Compare two arbitrary precision numbers
http://www.php.net/manual/en/function.bccomp.php

Turbohummel
23-11-2006, 13:09
Jap, die funzt auch. In unserem Fall war die Anzahl der Stelligkeit der Zahl jedoch nicht bekannt, deshalb war die Prozent-Lösung besser.

BlueJay
23-11-2006, 20:36
hallo,
ich habe bereits beim lesen meiner C-buecher gelesen, dass es hierbei oft
probleme geben kann, kann mir jemand sagen warum das manchmal funktioniert,
aber manchmal nicht, obwohl die kommastellen usw gleich sind (oder gleich zu sein scheinen)?

Das liegt an der internen Darstellung der Floater :) . Da ist 2.0*2.0 schon mal 3.999999999 (MS-Basic-Varianten, auch mindestens ein Javascript-Dialekt).

Die Naturwissenschaftler definieren sich in so einem Fall die Zahl eps, wenn die Differenz darunter sinkt, sind alle weiteren Berechnungen Kokolores/Haarspaltereien.

eps ist zum einen vom Compiler oder Interpreter abhängig, zum anderen vom Zahlentyp, zum dritten von der gewünschten Genauigkeit.

Also nur auf abs(x1-x2)<=eps testen ;)

so long,
BlueJay