Хорошо, это то, с чем я и мой коллега играем.
Мы знаем, что у 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
и рассчитать всю серию?
Пожалуйста, имейте в виду, что в этом нет ничего серьезного и просто веселого эксперимента для нас.
Просто используйте одну петлю. Есть $bottom
переменная, которую вы добавляете 2 на каждой итерации, делите на нее и складываете / вычитаете ее в зависимости от модуля:
$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 цикла, прежде чем вы начнете выходить из связанных ошибок.
Вы думаете об этом. Просто используйте модуль по модулю, чтобы решить, хотите ли вы добавить или вычесть и сделать это на месте.
$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);
}
}
pi()
Возвращает приближение числа пи. Возвращаемое значение с плавающей точкой имеет точность, основанную на директиве precision в 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;
Этот метод вычисления Пи медленный, но он легко читается.
Вы можете прочитать больше об этом методе здесь:
http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80
Если вы увеличите переменную $ precision, Pi будет вычисляться все более и более точно. В зависимости от скорости вашего веб-сервера, вы можете довольно быстро вычислить первые 6 цифр числа Пи.
Однако время, необходимое для вычисления каждого последующего числа, увеличивается в геометрической прогрессии. Для вычисления 20 цифр числа Пи с использованием этого метода может потребоваться годы.