Bei der Verarbeitung schwimmender Punktzahlen in PHP ist is_infinite () eine Funktion, mit der festgestellt wird, ob eine Variable unendlich ist. Obwohl es selbst Semantik ist, treten aufgrund der rechnerischen Eigenschaften von Gleitkomma-Zahlen und dem losen Typ von PHP auf, wenn sie unsachgemäß angewendet werden, einige schwer zu belegende Probleme auftreten. In diesem Artikel werden gemeinsame Fallstricke untersucht, wenn Sie die Gleitkommawerte unter Verwendung von is_infinite () beurteilen und einige praktische Vorschläge geben, um diese Probleme zu vermeiden.
Unendliche Werte erscheinen normalerweise in den folgenden Situationen:
Illegaler Null-Dividier-Betrieb (z. B. 1,0 / 0,0 )
Überlauf, der durch exponentielle Explosion verursacht wird (wie Exp (10000) )
Die importierten Daten in anderen Sprachen oder Systemen selbst haben unendliche Werte (wie JSON, API Returns)
Diese Fälle erzeugen INF- oder -INF -Werte, die in PHP als unendlich angesehen werden und durch is_infinite () identifiziert werden können.
$val = 1.0 / 0.0;
if (is_infinite($val)) {
echo "Der Wert ist unendlich groß";
}
Viele Entwickler nennen nur IS_Infinite () im Endergebnis, ignorieren jedoch die Berechnungsergebnisse der Zwischenschritte. Zum Beispiel:
$a = 1e308;
$b = 1e308;
$c = $a * $b;
if (!is_infinite($c)) {
echo "Rechensicherheit";
} else {
echo "Überlauf trat auf";
}
Im obigen Code wird das Ergebnis von $ a * $ b inf sein, auch wenn $ A und $ B selbst legal sind. Daher sollten auch Überprüfungen in die kritischen Berechnungsschritte eingefügt werden, anstatt nur das Endergebnis zu betrachten.
Bei der Verarbeitung schwimmender Punktwerte, die aus externen APIs oder JSON analysiert werden, können Daten mit Inf oder -inf auftreten. PHPs json_encode () und json_decode () können diese Werte standardmäßig nicht korrekt verarbeiten:
$data = ['value' => INF];
$json = json_encode($data);
// zurückkehren false,Weil INF Es ist illegal JSON Wert
Um diese Art von Situation zu bewältigen, können Sie die Filterlogik anpassen:
function safe_json_encode($data) {
array_walk_recursive($data, function (&$item) {
if (is_infinite($item)) {
$item = ($item > 0) ? 'INF' : '-INF';
}
});
return json_encode($data);
}
Oder überprüfen Sie, bevor Sie eine externe Quelle lesen:
$json = file_get_contents('https://gitbox.net/api/data');
$data = json_decode($json, true);
if (is_infinite($data['value'])) {
// Fehlerbehandlung durchführen
}
Wenn Sie ein Array mit unendlichen Werten sortieren oder vergleichen, können Sie einen logischen Fehler erleiden. Zum Beispiel:
$values = [1.5, INF, 3.0];
sort($values);
Obwohl INF korrekt eingestuft wird, wenn das folgende Urteil in der Geschäftslogik auftritt:
if ($values[2] > 1000000) {
// Ob es wirklich außerhalb der Reichweite bedeutet?
}
In diesem Fall sollten Sie klar feststellen, ob es unendlich ist, anstatt es mit einer bestimmten Schwelle zu vergleichen.
Explizite Check in Schlüsselvorgänge: Rufen Sie IS_Infinite () auf, nachdem alle Berechnungen zu extremen Werten führen können.
Externe Datenreinigung: Vorab zusammenarbeiten alle schwimmenden Punkteingangswerte, entfernen Sie Inf oder ersetzen Sie sie durch den geschäftsfürsorischen Maximalwert.
Kapselungsprüffunktion: Erstellen Sie eine einheitliche Methode zur Überprüfung des Gleitpunktwerts, wie z. B.:
function is_valid_float($val) {
return is_float($val) && !is_nan($val) && !is_infinite($val);
}
Legen Sie Geschäftsbeschränkungen für die Ergebnisse fest: Begrenzen Sie beispielsweise die schwimmenden Punktwerte wie Preis und belaufen sich auf einen angemessenen Bereich:
if ($amount > 1e12 || is_infinite($amount)) {
throw new Exception("Ungültiger Betrag");
}
Die Verwendung von is_infinite () in PHP scheint einfach zu sein, aber dahinter steckt jedoch mehrere potenzielle Risiken wie die Genauigkeit der schwimmenden Punkte, die Eingangsüberprüfung und die Grenzverarbeitung. Entwickler sollten wachsam sein, wenn sie die Floating-Punkt-Logik entwerfen und die Funktionen zur Grenzüberprüfung und zur Datenüberprüfung vernünftigerweise verwenden, um unvorhersehbare Verhaltens- oder Sicherheitsrisiken während der Laufzeit effektiv zu vermeiden. Durch die korrekte Identifizierung und Verarbeitung des Überlaufs des Schwimmpunkts kann die Robustheit und Stabilität des Systems erheblich verbessert werden.