2013-08-06 2 views
7

PHP bietet verschiedene Funktionen für Rechenmodul:

  1. Modulus operator %: echo ($a % $b);
  2. fmod()
  3. bcmod()
  4. gmp_mod()

Welche Funktion verwendet werden soll, die sicher und effizient in Betracht gezogen? die (devision von Null Problem betrachtet, die hier beschrieben: Division by zero error while using modulus und Gleitkommazahlen

+3

Vielleicht sollten Sie angeben, wie Sie erwarten, dass eine Null behandelt wird? –

+0

bitte bearbeiten und verbessern, ich fragte diese Frage als Referenz verwendet werden –

+0

Akam, was passieren sollte, wenn eine Null auftritt, ist spezifisch für das Problem/Domäne. Wenn Sie ein Wiki erstellen, in dem Sie beschreiben, was diese Funktionen tun, gehen Sie darauf ein. –

Antwort

21
  1. Nur der Modulo-Operator (%) und fmod sind native

  2. Der Modulo-Operator keine Zahlen über 2^32 verarbeiten kann (auf PHP läuft x86-Architektur)

  3. fmod läuft schneller als bcmod/gmp_mod ~ benchmark

  4. bcmod doesn ‚T mit Schwimmern arbeiten ~ here

Ich glaube, es ist am besten fmod zu verwenden, einfach weil es innerhalb Math Functions ist, läuft viel schneller als andere Funktion, und was am wichtigsten ist, kann eine große Anzahl und Schwimmer behandeln.

Wenn Sie nicht vorhaben, Nummern zu verwenden, die das Limit überschreiten oder schwebt, verwenden Sie %, da dies der schnellste sein sollte.

+0

2. ... 'große Zahlen ~ 34% 4294967296' zu '2^32' ändern, das ist eine große ganze Zahl auf 32 Bit OS –

+0

Da innerhalb von Math Functions keine Funktion besser oder schneller als andere ist, sollte man ihre Implementierung verstehen das zu beurteilen. Wenn man vorhat, unter dem Limit der Floats zu bleiben, ist es immer noch unsicher,% zu verwenden, man sollte unter max int bleiben, um Sicherheit zu erreichen. – sanyi

+0

% Operator verhält sich ein bisschen seltsam (PHP 5.4): '1.98% 1' ergibt 0 statt 0.98 – Erfan

1

Sie können immer noch den Modulo-Operator verwenden, und dieser kann immer noch sicher sein, vorausgesetzt, dass Sie an einem Punkt eine Null erwarten, wie unten gezeigt.

Zum Verstecken der Warnungen könnte auch ein Error Control Operator verwendet werden. Mit dem Operator @ wird der Fehler unterdrückt.

jedoch mit % kann eine ganze Zahl erhält nur so groß, bevor es in einen Schwimmer umgewandelt wird, damit die Einführung von bcmod und fmod aber bitte beachten sie beide ihre eigenen Grenzen.

Ich würde GMP reccommend oder vielleicht einen Blick auf eine der anderen erweiterten Mathematikfunktionen übernehmen, gibt es auch BCMath

Da Sie etwas sicher erwähnt gibt es eine Klasse für diese: Eval Math

Hier ein Beispiel fmod

<?php 
echo fmod('4294967296', 34); 
?> 

Ausgänge 18

+0

kannst du es bitte versuchen:' echo (34% 4294967296) ' –

+0

Die Antwort soweit ich weiß, ist auf einem 32-Bit-System eigentlich 0 weil es kann nicht durch eine Zahl dargestellt werden. Als eine Arbeit können Sie möglicherweise http://php.net/manual/en/function.unpack.php verwenden –

0

Beachten Sie, dass fmod nicht gleichwertig zu dieser Grundfunktion ist:

<?php 
    function modulo($a, $b) { 
    return $a - $b * floor($a/$b); 
    } 
    ?> 

weil fmod() einen Wert mit dem gleichen Vorzeichen zurück, wie $ ein. Mit anderen Worten, die floor() - Funktion ist nicht korrekt, da sie auf -INF anstatt auf Null gerundet wird.

Um fmod ($ a, $ b) der richtige Weg ist zu emulieren:

<?php 
    function fmod($a, $b) { 
    return $a - $b * (($b < 0) ? ceil($a/$b) : floor($a/$b))); 
    } 
    ?> 

Beachten Sie, dass beide Funktionen eine Division durch Null werfen, wenn $ b null ist.

Die erste Funktion Modulo() oben ist die mathematische Funktion, die für die Arbeit an zyklischen Strukturen (wie Kalander computions oder trignonometric Funktionen nützlich ist:

- fmod($a, 2*PI) returns a value in [0..2*PI) if $a is positive 
    - fmod($a, 2*PI) returns a value in [-2*PI..0] if $a is negative 
    - modulo($a, 2*PI) returns a value always in [0..2*PI) independantly of the sign of $a 
2

Alle Funktionen sicher zu bedienen bieten weiß, was ist tun:

  1. Modulus Betreiber: ist schnell, präzise, ​​aber Sie müssen unter dem max int bleiben Es gibt keine Division durch Null Problem auch immer in diesen Begriffen

  2. ..
  3. fmod: stil schnell, Fließkomma-Betrieb Geschwindigkeit ist in den letzten 10 Jahren kein Problem mehr, aber es ist schwierig. Fließkommazahlen können viel höhere Werte erreichen, aber ihre Präzision nicht. Bei der Arbeit mit großen Zahlen werden daher immer häufiger Rundungsfehler auftreten. Also wird nichts lösen, was dem Moduloperator fehlt, sondern Präzisionsprobleme einführen wird.

  4. bcmod und gmp_mod sind ähnlich. Der Unterschied besteht darin, dass diese Funktionen unterschiedliche Implementierungen (Module) beliebiger Arithmetik verwenden. Ihre Verwendung unterscheidet sich, aber ihre Ergebnisse nicht: Theoretisch ist die Größe der von diesen Bibliotheken unterstützten Zahlen nur durch die Menge an freiem Speicher begrenzt, so dass das Ergebnis praktisch immer gut und präzise ist, jedoch sind die verwendeten Algorithmen sowohl rechnerisch als auch absteigend Speicher Sicht.

Verwandte Themen