PHPには立方根など累乗根(冪根)を求める関数がありませんでした。
自作関数がStackOverflowにありましたが、わりとめんどいです。
というかこのNRoot()、NRoot('64','3')に'3'、NRoot('65','3')に'4'、NRoot('66','3')に'5'を返してくるんだがこれ合ってるのか?
PHP5.6では、このような怪しい自作関数に頼る必要はありません。
23 Jan 2014, PHP 5.6.0 Alpha 1
Added gmp_root() and gmp_rootrem() functions for calculating nth roots.
<?php
gmp_root('63', '3'), // 3
gmp_root('64', '3'), // 4
gmp_root('65', '3'), // 4
gmp_rootrem('63', '3'), // 3あまり36
gmp_rootrem('64', '3'), // 4あまり0
gmp_rootrem('65', '3') // 4あまり1
便利。
まあ累乗根なんていつ使うんだよという話ですが。
あとあくまで整数部分だけを返してくる関数なので、小数点以下まで求めたい場合はいったん1000を掛けてから計算してやる必要があります。
ところで、GMP演算の返り値はGMPオブジェクトです。
これまでGMPリソースを扱う場合は、ただの足し算でも
$c = gmp_add($a, $b);
などと書く必要がありました。
PHP5.6ではGMPの演算子オーバーロードもサポートされました。
<?php
gmp_init(1) + 2; // GMP(3)
gmp_init(1) + '1234567890123456789012345678901234567890'; // GMP(123456789012345678901234567891)
1 + '1234567890123456789012345678901234567890'; // float(1.2345678901235E+29)
GMPオブジェクトに対して演算を行った場合、GMPとして透過的に取り扱ってくれます。
これでもうgmp_add(gmp_add(gmp_add(gmp_add(gmp_init(1), 2), 3), 4), 5);
なんて書かずにすみます。
もうひとつ数学関連の機能追加がありました。
13 Feb 2014, PHP 5.6.0 Alpha 2
Added T_POW (**) operator
<?php
print(5 ** 3); // 125
2 ** 3 ** 4; // float(2.4178516392293E+24)
gmp_init(2) ** 3 ** 4; // GMP(2417851639229258349412352)
累乗演算子が追加になった模様。
こちらはpow()やgmp_pow()があるのであまり恩恵はない気もしますが、上記演算子オーバーロードと合わせるとその威力は歴然。
マニュアルの演算子の項目にはまだ載っていません。
優先順位は「*/%」のひとつ上で、かなり優先度高めでした。
これでPHPでも実用的な数学計算が行えますね。
まあそういうのはFORTRANやMATLABとかに任せとけよって話ですが。