PHPには立方根など累乗根(冪根)を求める関数がありませんでした。
自作関数がStackOverflowにありましたが、わりとめんどいです。
というかこのNRoot()、NRoot('64','3')に'3'、NRoot('65','3')に'4'、NRoot('66','3')に'5'を返してくるんだがこれ合ってるのか?
PHP5.6では、このような怪しい自作関数に頼る必要はありません。
https://github.com/php/php-src/blob/php-5.6.0alpha3/NEWS
> 23 Jan 2014, PHP 5.6.0 Alpha 1
> Added gmp_root() and gmp_rootrem() functions for calculating nth roots.
まあ累乗根なんていつ使うんだよという話ですが。
あとあくまで整数部分だけを返してくる関数なので、小数点以下まで求めたい場合はいったん1000を掛けてから計算してやる必要があります。
ところで、GMP演算の返り値はGMPオブジェクトです。
これまでGMPオブジェクトを扱う場合は、ただの足し算でも
$c = gmp_add($a, $b);
などと書く必要がありました。
PHP5.6では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
こちらはpow()やgmp_pow()があるのであまり恩恵はない気もしますが、上記演算子オーバーロードと合わせるとその威力は歴然。
マニュアルの演算子の項目にはまだ載っていません。
優先順位は「*/%」のひとつ上で、かなり優先度高めでした。
これでPHPでも実用的な数学計算が行えますね。
まあそういうのはFORTRANやMATLABとかに任せとけよって話ですが。
自作関数がStackOverflowにありましたが、わりとめんどいです。
というかこのNRoot()、NRoot('64','3')に'3'、NRoot('65','3')に'4'、NRoot('66','3')に'5'を返してくるんだがこれ合ってるのか?
PHP5.6では、このような怪しい自作関数に頼る必要はありません。
https://github.com/php/php-src/blob/php-5.6.0alpha3/NEWS
> 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(2) 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 print(4 ** 3 ** 2); // 262144 print(gmp_init(5) ** 3); // GMP(125)累乗演算子が追加になった模様。
こちらはpow()やgmp_pow()があるのであまり恩恵はない気もしますが、上記演算子オーバーロードと合わせるとその威力は歴然。
マニュアルの演算子の項目にはまだ載っていません。
優先順位は「*/%」のひとつ上で、かなり優先度高めでした。
これでPHPでも実用的な数学計算が行えますね。
まあそういうのはFORTRANやMATLABとかに任せとけよって話ですが。
PR