Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 30 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 30.04.2005
Откуда: Иден прайм
Приветствую всех.
Помогите решить задачу.
Я пытаюсь сделать приложение которое считало бы число ПИ по этой формуле http://upload.wikimedia.org/math/0/3/7/ ... 65027f.png
Это так называемая BBP формула, с помощью которой можно узнать сразу 14 чисел после запятой без знания предыдущих.
На сайте http://en.literateprograms.org/Pi_with_ ... la_(Python)
использую немного изменённую формулу и предлагают пример на Питоне.
Вот что написал я:
for (int i = 0; i < 2; i++)
{
//j = j + (1 / 16 ^ i);
PiD = PiD + ((1 / Math.Pow(16, i)) * (4.0 / (8.0 * i + 1.0)) - (2.0 / (8.0 * i + 4.0)) - (1.0 / (8.0 * i + 5.0)) - (1.0 / (8.0 * i + 6.0)));
listBox1.Items.Add(PiD.ToString());

}
Это по формуле из Википедии. Ни каких результатов манипуляция не даёт, хотя всё сделанно как в формуле.
Вот ещё. Аналог Питоновских скриптов:
private double Pi(int n)
{
//n -= 1;
double ret;
double x = (4.0 * S(1.0, n) - 2.0 * S(4.0, n) - S(5.0, n) - S(6.0, n)) % 1.0;

ret = x*Math.Pow(16,n);

return ret;

}
private double S(double j,int n)
{
double r = 0;
double s = 0;
double t = 0;
int nn = 0;

if (n == 0)
nn = n + 1;
else
nn = n;
//Левая сторона
for (int k = 0; k < nn; k++)
{
r = 8 * k + j;
s = s + ((Math.Pow(16, n - k) * r) / r) % 1.0;

}

//Правая сторона
double newt=0;
bool test = true;
int kk = n + 1;
while (test)
{
newt = t + (Math.Pow(16, n - kk) / (8 * kk + j));
if (t == newt)
test = false;
else
t = newt;
kk++;
Console.WriteLine("KK " + kk);
}
return s + t;

Тоже ни чего дельного не даёт.
Помогите реализовать этот метод вычисления числа ПИ. Очень нужно для исследования.
Спасибо!!!

_________________
#77



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
Во первых, быстрейший алгоритм для пи - это тоже из верии spigot-алгоритмов, но не BBP, а формула Беллара.
Во-вторых, у вас ошибка в формуле - открывающую скобку перед первой единицей нужно перенести за первый знак умножения.
В третьих, высчитывается n-ная двоичная цифра, а не десятичная.

C# во всем этом не виноват.
Слава великим математикам!


 

Member
Статус: Не в сети
Регистрация: 27.03.2007
Странно. Мне казалось, что быстрейший алгоритм - это итерационная формула Джонатана и Питера Борвинов, которая за каждую итерацию учетверяет число известных знаков.


 

Member
Статус: Не в сети
Регистрация: 30.04.2005
Откуда: Иден прайм
Я выбрал эту формулу потому, что с помощью неё можно вычислять цифры не зависимо. Т.е. если нужно вычислить 1миллион знаков, то к примеру первое ядро будет считать с 0 по 500 000 а второе ядро с 500 001 по 1000 000. Далее я хочу попробовать реализовать это на CUDA.
Вот только не могу понять этих формул.
Помогите разобраться.
В какой именно формуле ошибка в первой?
Да и формула выдаёт вообще не понятно число, как оно может быть двоичным.
Спасибо.

_________________
#77


 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
freeHerz писал(а):
Мне казалось, что быстрейший алгоритм

Я всегда думал что оптимальнее Гаусса-Лежандра, но вот как у неё с "многопоточностью" не знаю, не вдавался в подробности...

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 22.02.2008
Откуда: ниоткуда
Можешь посмотреть сырцы здесь: http://oldweb.cecm.sfu.ca/projects/pihex/source.html
Это формула Беллара. Она делает то же самое, что и твоя, но гораздо быстрее. И кстати, там как раз распределённые вычисления ;)


 

Member
Статус: Не в сети
Регистрация: 30.04.2005
Откуда: Иден прайм
Yubi
Спасибо!
Но что же всё таки в моей формуле не так?

Добавлено спустя 36 минут 23 секунды:
Формула Беллара позволяет вычислить n-й разряд π в двоичном представлении. Это быстрая модификация (приблизительно на 43% быстрее [1]) формулы формулы Бейли-Борвейна-Плуффа. Формула открыта французским программистом Фабрисом Белларом. Используется в проекте распределённого вычисления числа π PiHex. WIKIPEDIA
Если я просто перепишу эту формулу, что она мне даст в ответе какое число?

_________________
#77


 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
Вместо:
Кокс писал(а):
PiD = PiD + ((1 / Math.Pow(16, i)) * (4.0 / (8.0 * i + 1.0)) - (2.0 / (8.0 * i + 4.0)) - (1.0 / (8.0 * i + 5.0)) - (1.0 / (8.0 * i + 6.0)));

Нужно:
Код:
PiD = PiD + (1 / Math.Pow(16, i)) * ((4.0 / (8.0 * i + 1.0)) - (2.0 / (8.0 * i + 4.0)) - (1.0 / (8.0 * i + 5.0)) - (1.0 / (8.0 * i + 6.0)));

Теперь будет работать. Но, видимо, вы в самом начале пути, так как, для вычисления верных знаков, начиная с n-ной позиции эта формула непригодна и должна быть модифицирована для вывода bin/hex цифр. Если вам надо, то вы без труда это найдете.

Что касается алгоритма, то вот цитата от одного из авторов BBP (Bailey):
Цитата:
This formula as it stands permits pi to be computed fairly rapidly to any given precision (although it is not as efficient for that purpose as some other formulas that are now known


Для более быстрой реализации как раз подходит видоизмененный ряд Беллара.
Дерзайте.


 

Member
Статус: Не в сети
Регистрация: 30.04.2005
Откуда: Иден прайм
2 zauropod
Я не совсем понял мне числа в BIN считать, а потом в HEX переводить типа: byte i = 5;
Или как подскажите, уже долго мучаюсь не могу понять.

_________________
#77


 

Member
Статус: Не в сети
Регистрация: 10.12.2003
zauropod
Судя по Вашим постам Вы ничего не хотите делать сами. Вы даже не смогли в формуле скобки правильно расставить. Когда Вам указали, где и какая скобка стоит неправильно, Вы переспросили ТО ЖЕ САМОЕ еще раз, видимо ожидая что Вам не просто укажут где неправильно, но и напишут за Вас правильный вариант... Вам дали ссылку на более быстрый метод - я уверен, Вы в ней не разбирались. В английской википедии есть статья про "Bailey–Borwein–Plouffe formula". Ее, я уверен, Вы тоже не читали. Вы хотите чтобы кто-нибудь за Вас во всем разобрался и написал Вам формулу. С таким подходом Вам ничего не светит. И это справедливо.


 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
Кокс писал(а):
Помогите реализовать этот метод вычисления числа ПИ. Очень нужно для исследования.

Как-то не получается у меня связать исследователя, интересующегося математическими методами, с человеком, не умеющим элементарно получать информацию из открытых источников, тем паче из википедии. Если прочитать статью до конца, то есть раздел
BBP digit-extraction algorithm for π,
описывающий алгоритм. В конце есть ссылки на реализацию на С++.

Кокс писал(а):
Я не совсем понял мне числа в BIN считать, а потом в HEX переводить типа: byte i = 5

Тяжелый случай. Вы не считаете ЧИСЛА. Вы получаете нужную ЦИФРУ в системе счисления HEX/BIN. Ну или еще удобно в восьмеричной, но она мало кому интересна сегодня.И собираете из них результат.
Иначе никакой разрядной сетки под мантиссу не хватит.
Для контроля можно свериться с первыми 50000 hex-цифр :
http://www.nedprod.com/programs/portable/Pi/index.html

Добавлено спустя 2 минуты:
theone писал(а):
zauropod
Судя по Вашим постам Вы ничего не хотите делать сами. Вы даже не смогли в формуле скобки правильно расставить. Когда Вам указали, где и какая скобка стоит неправильно, Вы переспросили ТО ЖЕ САМОЕ еще раз,


Я то тут при чем?


 

Member
Статус: Не в сети
Регистрация: 30.04.2005
Откуда: Иден прайм
theone
А я думал, что этот раздел форума предназначен для помощи. Но если вы мните себя великими гуру и ни хотите объяснить суть непонимающим, зачем вообще тогда нужен ваш пост???
Спасибо всем, кто сказал что-нибудь по существу!!!
а не всякие там theone

Добавлено спустя 3 минуты 14 секунд:
Мои знания в математики и английском не так сильны. Поэтому я обращаюсь за помощью. Я просил если кто знает разъяснить что есть что.

Добавлено спустя 53 минуты 33 секунды:
zauropod писал(а):
В третьих, высчитывается n-ная двоичная цифра, а не десятичная.

Как это именно понять и как считать я не понимаю...
Расскажите если знаете.
Спасибо

_________________
#77


 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
Кокс писал(а):
Как это именно понять и как считать я не понимаю...
Расскажите если знаете.

С вашей никакой подготовкой по математике, программированию и английскому языку (а без него в вышеназванных областях никак) вам такие задачи решать рановато. Поучиться надо. И меня терзают смутные сомнения про вашу "исследовательскую задачу", не озвучите ли ее, может, найдется более простое решение?

А цифра находится просто. Означенная формула разлагается на составляющие (4 для BBP). Для получения n-ной цифры каждая составляющая разбивается еще на две компоненты - одна с суммированием от 0 до n, вторая - от n+1 до бесконечности (реально можно до n+5, так как уже будет достигнут верный результат). Так как точку n можно считать водоразделом между (условной) целой и дробной частями, то умножаем все компоненты на 16 в степени n. Из двух компонентов каждой составляющей только первый (у всех четырех) может быть больше единицы, поэтому, так как нас интересует дробная часть (условная), числитель у них берется по модулю знаменателя. Затем все компоненты суммируются. Целая часть отбрасывается, сдвиг влево на четыре бита ( или первые четыре бита ) дает искомую цифру. Тут можно поиграться с величиной (от n+1 до бесконечности) и сдвигом, в зависимости от аппетитов, для получения нескольких цифр.


 

Member
Статус: Не в сети
Регистрация: 30.04.2005
Откуда: Иден прайм
zauropod
Спасибо! Ждите результатов. Я справлюсь.

_________________
#77


 

Member
Статус: Не в сети
Регистрация: 03.03.2010
Код:
PiD=0;
for(var i=0,n=1,a=1,b=1,c=5,d=3; i < 11; i++,n*=16,a+=8,b+=2,c+=8,d+=4){
   l = (120*i*i+151*i+47);
   PiD += l / (a * b * c * d * n);
   WScript.StdOut.WriteLine(i+"   "+l+"   "+a+"   "+b+"   "+c+"   "+d+"   "+n)
}
   WScript.StdOut.WriteLine(PiD)

Скопируйте этот текст в файл "pi.js"
Потом наберите в командной строке

cscript pi.js >res.txt

Результат ищите в файле res.txt


 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
Masterov
Ну и к чему эта ерунда?
Такая программа и на сях почти так же выглядит.

Как найти, к примеру миллионную цифру после запятой в вашей программе?


 

Member
Статус: Не в сети
Регистрация: 03.03.2010
zauropod писал(а):
Masterov
Ну и к чему эта ерунда?
Такая программа и на сях почти так же выглядит.

Как найти, к примеру миллионную цифру после запятой в вашей программе?
Я привел это как пример того - как можно быстро получать результаты (без всяких там Си).
А чтоб получить милионную долю не нужно писать програму, да это и неинтересно. (Такая програма уже написана ниединожды.) Нужно просто из интернета скачать файл, в котором есть и милиардные доли.
А програма, которую я привел - одна из тех, что превращают Пи в произведение степеней простых чисел.
Например, число 1048573 - простое. И это я вычислил без Си, и представил факториал 1048576 в виде произведения степеней простых чисел на JavaScript. (Хотя могу и на Си, и на Java, и много ещё на чём.)


 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
Masterov писал(а):
Я привел это как пример того - как можно быстро получать результаты (без всяких там Си).

Вы название тем читаете, прежде, чем постить?
Правильно сказали в общей ветке про программирование, что вы спамобототролль. К тому же, пропагандирующий второсортный подход к вопросу.

Masterov писал(а):
И это я вычислил без Си

Не вводите людей в заблуждение. Чтобы вы смогли сделать это "без всяких там Си", сотни людей, интенсивно используя Си, написали соответствующие программы. И сделали удобный ДОПОЛНИТЕЛЬНЫЙ инструмент для простых вычислений. Который можно использовать достаточно широко, и только там, где не требуется достигать максимального быстродействия. И есть масса областей, где этот подход неприемлим.
Пропаганда js это, конечно, хорошо, но вы перегибаете палку и спамите.

Masterov писал(а):
А чтоб получить милионную долю не нужно писать програму, да это и неинтересно. (Такая програма уже написана ниединожды.)

Так и таблицы Брадиса никто не отменял. Пользуйтесь на здоровье.

Человек в этой ветке хочет разобраться САМ. С алгоритмом и с программой. Не мешайте ему.


 

Member
Статус: Не в сети
Регистрация: 03.03.2010
спамобототролль?
Так меня ещё никто не называл?
второсортный подход?
Вы несправедливы. За 30 лет я много чего попробовал, и полон уверенности, что JavaScript (применительно к весьма широкому кругу задач) - лучший язык программирования.
Вы будете говорить, что Си даёт лучшую производительность, и т.п., но - Вы не правы: то, что я пишу на JavaScript за пять минут, вы на Си будете писать полчаса. На JavaScript програма выполнится за две секунды, а на Си - за одну. Ну и где выигрыш в производительности Си?
zauropod писал(а):
Так и таблицы Брадиса никто не отменял. Пользуйтесь на здоровье.
Вы меня опередили. Я хотел вам предложить воспользоваться деревянными счётами вместо компьютера: их не токмо вирусы не берут, но даже и - плесень. (Деревянные счеты пропитаны такой морилкой, что они ещё однин срок, что отделяет нас от эпохи динозавров, переживут.)
Цитата:
Человек в этой ветке хочет разобраться САМ. С алгоритмом и с программой. Не мешайте ему.
А не вы ли его путаете своим Си.
Чтоб решить свою задачу вашим способом ему нужно научиться ублажать сишный компилятор, нужно научиться выделять и освобождать память под массив и пользоваться указателями, нужно научиться преобразовывать типы и выводить форматированную строку на экран, прежде чем он решит свою простенькую задачу.
Тот инструмент, что я предлагаю легко решает 98% всех задач, которые люди на практике перед собой ставят, а Си решает только одну из 50-ти.
Язык Си хорошь для написания нативных библиотек и ядра операционки, но - не для повседневного использования. Для повседневного использования язык программирования Си третьего сорта. Зачем вы его рекламируете?


 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
Masterov писал(а):
то, что я пишу на JavaScript за пять минут, вы на Си будете писать полчаса

Если писать в блокноте а компилировать из командной строки то вероятно, в противном случае то что вы будете писать 5 минут любой человек имеющий нормальную IDE напишет секунд за 30.

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 30 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan