忍者ブログ
[PR]
×

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



2017/03/29 20:14 |
PHP5.6.0α PHPで累乗根を求める
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.
<?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


2014/03/21 23:03 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<買ったものリスト 2014/03/23 | HOME | OREDON『今更phpでオブジェクト指向プログラミング応用その3 BBSを作る』の感想>>
忍者ブログ[PR]