PHPの数値型、いわゆるintは有効数字が10桁とか20桁とかしかありません。
それを超えるとfloat型になり、精度が適当に切り詰められてしまいます。
もっと桁の大きな整数を精密な値で扱いたいというときは、任意精度整数を使用します。
ところが困ったことにPHPにはGMPとBCMathという2種類の任意精度整数があり、関数名や使用法がばらばらです。
環境によってどちらかが入っていなかったりといったこともありえます。
面倒ですね。
ということで両者を同じように扱えるMath\BigIntegerです。
add()の中身がbcadd()かgmp_add()か、あるいは他の見知らぬ関数であったりするかなどといったことを一切考える必要がなく、どんな環境でも簡単に使用できる便利な使用法となります。
なおGMPもBCMathも入っていない場合はさすがに無理なので、アダプタを取得しようとしたところで例外が発生して停止します。
それを超えるとfloat型になり、精度が適当に切り詰められてしまいます。
もっと桁の大きな整数を精密な値で扱いたいというときは、任意精度整数を使用します。
ところが困ったことにPHPにはGMPとBCMathという2種類の任意精度整数があり、関数名や使用法がばらばらです。
環境によってどちらかが入っていなかったりといったこともありえます。
面倒ですね。
ということで両者を同じように扱えるMath\BigIntegerです。
<?php
require_once('../../../../channel/vendor/autoload.php');
// 有効な任意精度整数アダプタを取得 ※どれも同じ
$bigInteger = Zend\Math\BigInteger\BigInteger::factory();
$bigInteger = Zend\Math\BigInteger\BigInteger::getDefaultAdapter();
$bigInteger = Zend\Math\BigInteger\BigInteger::getAvailableAdapter();
// 四則演算
$add = $bigInteger->add('987654321098765432109', '123456789012345678901'); //和
$sub = $bigInteger->sub('987654321098765432109', '123456789012345678901'); //差
$mul = $bigInteger->mul('987654321098765432109', '123456789012345678901'); //積
$div = $bigInteger->div('987654321098765432109', '123456789012345678901'); //商
// その他の演算
$pow = $bigInteger->pow('987654321098765432109', '10'); //累乗
$sqrt= $bigInteger->sqrt('987654321098765432109'); //平方根
$abs = $bigInteger->abs('987654321098765432109'); //絶対値
$mod = $bigInteger->mod('987654321098765432109', '123456789012345678901'); //剰余
// powしてmod
$powmod = $bigInteger->powmod('987654321098765432109', '10', '123456789012345678901');
// 比較演算子"<=>"
$comp = $bigInteger->comp('987654321098765432109', '123456789012345678901');
// バイナリに
$bin = $bigInteger->intToBin('987654321098765432109');
// バイナリからintに戻す
$int = $bigInteger->binToInt($bin);
// 任意進数に変換(最大62)
$oct = $bigInteger->baseConvert('987654321098765432109', 10, 8);
BigInteger::getAvailableAdapter()等で、有効な任意精度整数を取得することができます。add()の中身がbcadd()かgmp_add()か、あるいは他の見知らぬ関数であったりするかなどといったことを一切考える必要がなく、どんな環境でも簡単に使用できる便利な使用法となります。
なおGMPもBCMathも入っていない場合はさすがに無理なので、アダプタを取得しようとしたところで例外が発生して停止します。
PR