PHP には、モジュラスを計算するためのさまざまな関数が用意されています。
安全で効率的と考えられる関数はどれを使用する必要がありますか? (ここで説明したゼロによる除算の問題を考慮してください:モジュラスと浮動小数点数を使用している間のゼロによる除算エラー?
以下に示すように、ある時点でゼロを予期する場合は、モジュラス演算子を引き続き使用でき、安全です。
if ($y > 0) {
// Do the calculation
}
else {
// Do this instead
}
警告を非表示にするだけで、Error Control Operatorを使用することもできます。Operatorを使用すること@
で、エラーが抑制されます。
ただし%
、整数は float に変換される前に非常に大きくなる可能性があるため、bcmodとfmodが導入されましたが、どちらにも独自の制限があることに注意してください。
GMPをお勧めするか、他の強化された数学関数の 1 つを調べてみてください。BCMathもあります。
安全なことについて言及したので、このためのクラスがあります: Eval Math
を使用した例を次に示します。fmod
<?php
echo fmod('4294967296', 34);
?>
出力18
fmod は、この基本関数と同等ではないことに注意してください。
<?php
function modulo($a, $b) {
return $a - $b * floor($a / $b);
}
?>
fmod() は $a と同じ符号の値を返すためです。つまり、floor() 関数は、0 ではなく -INF に向かって丸められるため、正しくありません。
fmod($a, $b) をエミュレートする正しい方法は次のとおりです。
<?php
function fmod($a, $b) {
return $a - $b * (($b < 0) ? ceil($a / $b) : floor($a / $b)));
}
?>
$b が null の場合、両方の関数が DIVISION BY ZERO をスローすることに注意してください。
上記の最初の関数 modulo() は、循環構造 (カレンダー計算や三角関数など) で作業するのに役立つ数学関数です。
- 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