Просмотр полной версии : [php] Алгоритм получения числа Пи
Собственно заинтересовала тема связанная с числом Пи.
Возможно выбрал не самый подходящий язык, а именно php. Собственно возникла проблема с выбором оптимального алгоритма для получения числа Пи, скажем с точночтью до 10^100 знаков после запятой. Может кто сталкивался с такими вычеслениями, буду признателен за любую инфу в этом направлении.
astrologer
27.11.2009, 23:43
Собственно возникла проблема с выбором оптимального алгоритма для получения числа Пи, скажем с точночтью до 10^100 знаков после запятой. Для начала тебе понадобится вселенная побольше. В этой не хватит места, чтобы их записать.
Adekvatnyj
27.11.2009, 23:53
Число пи?) А что это ?)))
А если серьезно 2(Pi)r квадрат
wildshaman
27.11.2009, 23:56
Число пи?) А что это ?)))
А если серьезно 2(Pi)r квадрат
В школе новую формулу выучили? Поздравляю.
Тс, дели 22 на 7
Adekvatnyj
28.11.2009, 00:04
В школе новую формулу выучили? Поздравляю.
Тс, дели 22 на 7
нет вроде в школе уже давно ничему не учили.
А ты вижу гуглишь норм.
Тс, дели 22 на 7
22/7=3,142857
Увы. но это не подходит ибо не соответствие уже в 3 знаке, а речь идет о точности 10^100 знаков. Интересует реализация в коде, пусть в общем виде, главное получить результат в виде массива n*m.
wildshaman
28.11.2009, 00:18
Да, 22\7 -не самая точная рациональная дрбь.
На вики рапсисано много алогритмов получения - http://ru.wikipedia.org/wiki/Pi
с точночтью до 10^100 знаков после запятой.
а ничего что (выдержка из мануала по php)размер целого зависит от платформы, хотя максимум, как правило, ~1.8e308 с точностью около 14 десятичных цифр (это 64-битный IEEE-формат).
<?php
$numb=22/7;
sprintf("%.1000000000000f",$numb);
?>
Парси это =)
http://pi314.narod.ru/pi314.htm
-
А вообще почитай может интересно будет
http://algolist.manual.ru/maths/count_fast/pi.php
precision в php.ini не забудьте поменять )).
Собственно возникла проблема с выбором оптимального алгоритма для получения числа Пи, скажем с точночтью до 10^100 знаков после запятой.
Цитаты с вики
Текущий рекорд — 1 241 100 000 000 десятичных знаков, установлен Канадой и его группой в 2002 году...
Вычисление было выполнено на суперкомпьютере Хитачи из 64 узлов с 1 терабайтом оперативной памяти, способном выполнять 2 триллиона операций в секунду.
ТС, а сколько, простите, у вас суперкомпьютеров в наличие, если вы замахиваетесь на такую точность?
на пэхе врядли точнее 7-8 символов получится
http://ipicture.ru/uploads/091128/13581/NpeTF2yA0j.png
алгоритм взят из вики
<?php
$pi = 0;
for($i=0;$i<99999999999999999;$i=$i+4)
{
$pi = $pi + 1/($i+1)-1/($i+3);
echo $pi*4 ;
echo "\n" ;
}
?>
Что, классов для работы с большими числами не существует?
Цитаты с вики
ТС, а сколько, простите, у вас суперкомпьютеров в наличие, если вы замахиваетесь на такую точность?
Один. Но изначально я ошибся в плане php, залез в этот раздел потому как он более живой, а в алгоритме поправтье если это не так, главное не язык на котором кодить, а сам алгоритм . Цель не брать "железом", а совершенствовать, (оптимизировать) сам алгоритм вычислений числа Pi. Зачем супержелезо если например взять нейронные сети или как вариант ботнет для распределенных вычислений, ну или ..... Вот собственно поэтому и создал тему так как надеюсь услышать советы в данном направлении с компетентных уст.
кмк, лучше комбинации C + Asm вы вряд ли найдете по скорости работы. PHP для таких расчетов не годится, имхо. Он не для этого создавался.
ЗЫ. Никто не мешает реализовать один и тот же алгоритм с фиксированным числом итераций на разных ЯП и сравнить
Root-access
29.11.2009, 23:03
кмк, лучше комбинации C + Asm вы вряд ли найдете по скорости работы. PHP для таких расчетов не годится, имхо. Он не для этого создавался.
ЗЫ. Никто не мешает реализовать один и тот же алгоритм с фиксированным числом итераций на разных ЯП и сравнить
Думаю, что для высоконагруженных математических расчётов больше подходит функциональное программирование.
Рекомендую Erlang - он очень хорош для распределённого программирования, и в нём нет ограничений на величину чисел.
<?php
$r = 4;
$tochnost = 1000000;
function y($x) {
global $r;
return sqrt($r*$r-$x*$x);
}
for($i=-$r*$tochnost;$i<$r*$tochnost;$i++) {
$x1 = $i/$tochnost;
$y1 = y($x1);
$x2 = ($i+1)/$tochnost;
$y2 = y($x2);
$d += sqrt(pow(($x2-$x1),2)+pow(($y2-$y1),2));
}
echo 'pi = '.$d/$r;
?>
Еще как вариант,длинные числа можно выводить постепенно.Тоесть - считать постепенно.Сначала считаем сотые,затем тысячные,и так до скольки хотите.Я бы делал наверное так,с глубиной вложения гдето на 15-20 знаковых отличий.
<?php
echo pi();
?>
result: 3.1415926535898
Пи - константа, и какой смысл изобретать алгоритм для ее обноружения?
LStr1ke, пи не может быть константой т.к. число вроде как бесконечное.
Число "пи" () выражает отношение длины окружности к своему диаметру. (с)
а согласно постулату Архимеда "Отношение любой окружности к ее диаметру меньше чем 3 1/7 и больше 3 10/71". Значит число ограничено. Вопрос лишь в каличестве знаков.
Как раз этим ТС и собирается заняться - количеством знаков после запятой
=\
http://en.wikipedia.org/wiki/Gauss-Legendre_algorithm
ТСу в помощь
И все же,можно сделать так.Теория:
$eas = 10;
$gau = 3;
Далее,делаем цикл глудиной $eas. В нем считаем число пи,и округляем до $gau знаков после запятой.Все остальное засчитываем в переменную.В следующем витке цикла,считаем число пи опять,но считаем только ту часть,которая идет после пред-идущего ответа,и сравниваем с предидущим ответом и округляем в меьшую сторону.Полученый ответ заносим в переменную пи,точнее добавлям..И так,до конца $eas. В конце мы получаем почти точное число,с точностью до $eas*$gau знаков. Ну как то так.Это прсото теория, если немножно изменить,то можно юзать.
NigHT_0WL
02.12.2009, 18:30
И все же,можно сделать так.Теория:
$eas = 10;
$gau = 3;
Далее,делаем цикл глудиной $eas. В нем считаем число пи,и округляем до $gau знаков после запятой.Все остальное засчитываем в переменную.В следующем витке цикла,считаем число пи опять,но считаем только ту часть,которая идет после пред-идущего ответа,и сравниваем с предидущим ответом и округляем в меьшую сторону.Полученый ответ заносим в переменную пи,точнее добавлям..И так,до конца $eas. В конце мы получаем почти точное число,с точностью до $eas*$gau знаков. Ну как то так.Это прсото теория, если немножно изменить,то можно юзать.
это все хорошо, но современные методы и среды программирования допускают погрешности. "Переменные, представляющие число с плавающей точкой, то есть, представляющие собой десятичную дробь. Величина со спецификатором типа float занимает 4 байта. Величина типа double занимает 8 байт в памяти. Есть еще тип long double. Беда, правда, в том, что у него разные размеры на разных компиляторах, а в некоторых он вообще отсутствует."
это развитие нейросетей, не для того, чтобы высчитать число ПИ, а для того, чтобы найти подходящий алгоритм его вычисления. Кстати спасибо за топик, много интересной информации подчерпнул по ходу исследования вопроса))
Значит число ограничено. Потому что тебе так сосед сказал?))
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot