忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/07/23 19:50 |
ZF2.0 Zend\Math\BigInteger
PHPの数値型、いわゆるintは有効数字が10桁とか20桁とかしかありません。
それを超えるとfloat型になり、精度が適当に切り詰められてしまいます。

もっと桁の大きな整数を精密な値で扱いたいというときは、任意精度整数を使用します。

ところが困ったことにPHPにはGMPBCMathという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


2012/11/05 23:50 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP5.3 三項演算子と文字列演算子を同時に使用 | HOME | 買ったものリスト 2012/11/04>>
忍者ブログ[PR]