Aktueller Standort: Startseite> Neueste Artikel> Lösen Sie Fehler, die durch schwimmende numerische Fehler zwischen IS_NAN und PHP verursacht werden

Lösen Sie Fehler, die durch schwimmende numerische Fehler zwischen IS_NAN und PHP verursacht werden

gitbox 2025-05-27

Schwimmender numerischer Fehler ist ein häufiges Problem bei der Verwendung von PHP für numerische Berechnungen. Besonders wenn wir mit schwimmenden Werten zu tun haben, können wir auf schwierige Fehler stoßen. Einer der häufigsten Fehler ist, dass das von der Funktion is_nan () zurückgegebene Ergebnis nicht wie erwartet ist. Diese Situation wird normalerweise durch schwimmende numerische Fehler verursacht, und in diesem Artikel wird untersucht, wie dieses Problem gelöst und einige Lösungen bereitgestellt werden, um diesen Fehler zu vermeiden oder umzugehen.

1. Verstehen Sie die IS_NAN -Funktion

IS_NAN ist eine Funktion, die in PHP verwendet wird, um festzustellen, ob eine Variable ein "Nichtnummer" (NAN, nicht ein Zahl) ist. NAN -Werte sind normalerweise Ausreißer, die während schwimmender numerischer Berechnungen auftreten. Wenn Sie beispielsweise versuchen, einer Variablen eine ungültige mathematische Operation zuzuweisen, können Sie NAN erhalten. Beispielsweise führen ungültige mathematische Operationen wie 0/0 oder SQRT (-1) normalerweise zu einem Ergebnis-NAN.

 <?php
$val = 0 / 0;  // Das ist NaN
if (is_nan($val)) {
    echo "The value is NaN.";
}
?>

2. Numerischer Fehler und Nan

Schwimmende numerische Fehler werden normalerweise durch die Unfähigkeit der Computer, bestimmte Dezimalwerte genau darzustellen, verursacht. Beim Umgang mit schwimmenden Werten können einige Werte aufgrund der Einschränkungen der Binärverschwemdungspunkt -Darstellungen sehr nahe am erwarteten Wert liegen, sind jedoch intern als leicht voreingenommene Werte dargestellt. Zum Beispiel:

 <?php
$val1 = 0.1 + 0.2;
$val2 = 0.3;
if ($val1 == $val2) {
    echo "Equal!";
} else {
    echo "Not equal!";
}
?>

Obwohl das mathematische Ergebnis von 0,1 + 0,2 in der schwimmenden Punktdarstellung des Computers gleich 0,3 sein sollte, können sie tatsächlich unterschiedlich sein, was zu einem Versagen führt.

3. Die Beziehung zwischen IS_NAN und Floating Numerical Fehler

Die Funktion is_nan () erkennt, ob ein Wert NAN ist, aber da die Darstellung von schwimmenden Werten unvollständig genau ist, kann das Programm bei einigen Berechnungen einige Werte in der Nähe von NAN als NAN als NAN berücksichtigen und einige schwer zu diagnostizierende Probleme verursachen. Beispielsweise kann ein Programm einen ursprünglich gültigen Wert als NAN betrachten, der die nachfolgende Berechnungslogik beeinflusst.

4. Lösung: Vermeiden Sie eine Fehleinschätzung von NAN

Um zu vermeiden, dass die Funktion is_nan () die fehlgabenden schwimmenden Werte fehleinschätzt, können die folgenden Methoden verwendet werden:

Methode 1: Verwenden Sie die Funktion is_finite ()

In PHP wird die Funktion is_finite () verwendet, um festzustellen, ob ein schwimmender Wert ein endlicher Wert ist. Wenn ein Wert unendlich (positiv/negativ unendlich) oder NAN ist, gibt IS_FINIT () FALSE zurück, was Probleme im Zusammenhang mit dem NAN -Urteilsvermögen vermeiden kann.

 <?php
$val = 0.1 + 0.2;
if (!is_finite($val)) {
    echo "The value is not a valid finite number.";
}
?>

Methode 2: Stellen Sie die Toleranz für schwimmende Werte ein

Aufgrund des Darstellungsfehlers der schwebenden Werte kann der direkte Vergleich von zwei schwimmenden Werten zu Fehlern führen. Eine Toleranz (Epsilon) kann festgelegt werden, und wenn die Differenz zwischen den beiden Werten geringer ist als diese Toleranz, werden sie als gleich angesehen.

 <?php
$val1 = 0.1 + 0.2;
$val2 = 0.3;
$epsilon = 0.0000001; // Toleranz setzen
if (abs($val1 - $val2) < $epsilon) {
    echo "The values are approximately equal.";
} else {
    echo "The values are not equal.";
}
?>

Methode 3: Verwenden Sie die Bibliothek, um schwimmende numerische Fehler zu behandeln

Einige Bibliotheken (wie BCMath oder GMP ) können eine höhere numerische Berechnungen mit höheren Präzisionsberechnungen liefern und die Auswirkungen schwimmender numerischer Fehler vermeiden. Wenn Ihre Anwendung hochpräzise schwimmende numerische Operationen verarbeiten muss, ist die Verwendung dieser Bibliotheken möglicherweise hilfreich.

 <?php
$val1 = bcmul('0.1', '3', 10); // Hochvorbereitete Berechnung
$val2 = '0.3';
if (bccomp($val1, $val2, 10) === 0) {
    echo "The values are approximately equal.";
} else {
    echo "The values are not equal.";
}
?>

Methode 4: NAN mit Filter_var erkennen

Eine andere Möglichkeit besteht darin, die Funktion filter_var () zu verwenden, um festzustellen, ob es sich um einen gültigen schwebenden Wert handelt. Diese Methode kann Ihnen helfen, Fehler beim manuellen Vergleich von NAN -Werten zu vermeiden.

 <?php
$val = 0/0; // NaN
if (!filter_var($val, FILTER_VALIDATE_FLOAT)) {
    echo "The value is NaN.";
}
?>

5. Zusammenfassung

Beim Umgang mit schwimmenden Werten in PHP kann die IS_NAN -Funktion aufgrund von Floating -Wertenfehlern einige Probleme verursachen. Um dies zu vermeiden, können Sie einige andere Funktionen oder Methoden wie is_finite () , bcmath und andere Bibliotheken verwenden oder die Toleranz für schwimmende numerische Vergleiche festlegen, um die Stabilität und Genauigkeit des Programms zu gewährleisten. In Szenarien mit hochpräzisen Berechnungen wird empfohlen, eine spezielle numerische Bibliothek zu verwenden, um Fehler zu vermeiden.

Mit diesen Methoden können Sie IS_NAN -Funktionsprobleme, die durch schwimmende numerische Fehler verursacht werden, effektiv vermeiden und die Richtigkeit des Programms sicherstellen.