使用 PHP 计算 Pi
Using PHP to calculate Pi
好的,这只是我和我的同事正在玩的东西。
我们知道 PHP 有它自己的 PI 函数,但这是出于理论和好奇心。
所以我们想知道 PHP 是否以及如何计算 pi
。
pi
= π= 4/1 - 4/3 + 4/5 - 4/7 + 4/9...
的公式
这是我们所做的:
$theValue = 100;// the max
for ($i=1; $i<$theValue; $i++){
if ($i % 2 == 1){
$iWaardes[] = 4 / $i; // divide 4 by all uneven numbers and store them in an array
}
}
// Use the array's $keys as incrementing numbers to calculate the $values.
for ($a=0, $b=1, $c=2; $a<$theValue; $a+=3, $b+=3, $c+=3 ){
echo ($iWaardes[$a] - $iWaardes[$b] + $iWaardes[$c]).'<br>';
}
所以现在我们有一个循环来计算 4/1 - 4/3 + 4/5
的第一个系列,但它在那之后停止并从以下 3 个序列重新开始。
我们怎样才能使它 运行 整个 $theValue
并计算整个系列?
请记住,这不是什么大事,对我们来说只是一个有趣的实验。
你想多了。只需使用模数来决定是否要加或减并在适当的地方进行。
$theValue = 100;// the max
$pi = 0;
for ($i=1; $i<$theValue; $i++){
if ($i % 2 == 1){
$pi += 4.0 / ($i * 2 - 1);
} else {
$pi -= 4.0 / ($i * 2 - 1);
}
}
只需使用一个循环。有一个 $bottom
变量,你在每次迭代中加 2,除以它,然后根据模数添加 it/subtract 它:
$theValue = 10000; // the max
$bottom = 1;
$pi = 0;
for ($i = 1; $i < $theValue; $i++) {
if ($i % 2 == 1) {
$pi += 4 / $bottom;
} else {
$pi -= 4 / $bottom;
}
$bottom += 2;
}
var_dump($pi); // 3.14169266359
你的代码有什么问题(除了没有除以适当的数字)是第二个循环。由于某种原因,您要将存储的数字 3 乘以 3 打印出来。这直到 $a
增加 3,低于 $theValue
,后者高得多。因此,例如,如果 $theValue
为 10,则在开始出现越界错误之前只需要 2 个循环。
pi()
Returns 圆周率的近似值。返回的浮点数具有基于 php.ini 中的精度指令的精度,默认为 14。此外,您可以使用 M_PI 常量,它产生与 pi()
相同的结果
使用 PHP 我们也可以计算 Pi,尽管非常慢。
$pi = 4; $top = 4; $bot = 3; $minus = TRUE;
$accuracy = 1000000;
for($i = 0; $i < $accuracy; $i++)
{
$pi += ( $minus ? -($top/$bot) : ($top/$bot) );
$minus = ( $minus ? FALSE : TRUE);
$bot += 2;
}
print "Pi ~=: " . $pi;
这种计算Pi的方法速度慢,但代码易读。
您可以在此处阅读有关此方法的更多信息:
http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80
如果增加 $accuracy 变量,Pi 的计算会越来越准确。根据您的 Web 服务器的速度,您可以相当快地计算出 Pi 的前 6 位数字。
然而,计算每个后续数字所需的时间呈指数增长。使用此方法计算 20 位数的 Pi 可能需要数年时间。
好的,这只是我和我的同事正在玩的东西。 我们知道 PHP 有它自己的 PI 函数,但这是出于理论和好奇心。
所以我们想知道 PHP 是否以及如何计算 pi
。
pi
= π= 4/1 - 4/3 + 4/5 - 4/7 + 4/9...
这是我们所做的:
$theValue = 100;// the max
for ($i=1; $i<$theValue; $i++){
if ($i % 2 == 1){
$iWaardes[] = 4 / $i; // divide 4 by all uneven numbers and store them in an array
}
}
// Use the array's $keys as incrementing numbers to calculate the $values.
for ($a=0, $b=1, $c=2; $a<$theValue; $a+=3, $b+=3, $c+=3 ){
echo ($iWaardes[$a] - $iWaardes[$b] + $iWaardes[$c]).'<br>';
}
所以现在我们有一个循环来计算 4/1 - 4/3 + 4/5
的第一个系列,但它在那之后停止并从以下 3 个序列重新开始。
我们怎样才能使它 运行 整个 $theValue
并计算整个系列?
请记住,这不是什么大事,对我们来说只是一个有趣的实验。
你想多了。只需使用模数来决定是否要加或减并在适当的地方进行。
$theValue = 100;// the max
$pi = 0;
for ($i=1; $i<$theValue; $i++){
if ($i % 2 == 1){
$pi += 4.0 / ($i * 2 - 1);
} else {
$pi -= 4.0 / ($i * 2 - 1);
}
}
只需使用一个循环。有一个 $bottom
变量,你在每次迭代中加 2,除以它,然后根据模数添加 it/subtract 它:
$theValue = 10000; // the max
$bottom = 1;
$pi = 0;
for ($i = 1; $i < $theValue; $i++) {
if ($i % 2 == 1) {
$pi += 4 / $bottom;
} else {
$pi -= 4 / $bottom;
}
$bottom += 2;
}
var_dump($pi); // 3.14169266359
你的代码有什么问题(除了没有除以适当的数字)是第二个循环。由于某种原因,您要将存储的数字 3 乘以 3 打印出来。这直到 $a
增加 3,低于 $theValue
,后者高得多。因此,例如,如果 $theValue
为 10,则在开始出现越界错误之前只需要 2 个循环。
pi()
Returns 圆周率的近似值。返回的浮点数具有基于 php.ini 中的精度指令的精度,默认为 14。此外,您可以使用 M_PI 常量,它产生与 pi()
使用 PHP 我们也可以计算 Pi,尽管非常慢。
$pi = 4; $top = 4; $bot = 3; $minus = TRUE;
$accuracy = 1000000;
for($i = 0; $i < $accuracy; $i++)
{
$pi += ( $minus ? -($top/$bot) : ($top/$bot) );
$minus = ( $minus ? FALSE : TRUE);
$bot += 2;
}
print "Pi ~=: " . $pi;
这种计算Pi的方法速度慢,但代码易读。 您可以在此处阅读有关此方法的更多信息: http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80
如果增加 $accuracy 变量,Pi 的计算会越来越准确。根据您的 Web 服务器的速度,您可以相当快地计算出 Pi 的前 6 位数字。
然而,计算每个后续数字所需的时间呈指数增长。使用此方法计算 20 位数的 Pi 可能需要数年时间。