Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2013, 15:56   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Вычисление n-ной цифры в pi

Не буду ходить вокруг да около. Формула вычисления внизу.
Код
Код:
#include<stdio.h>
#include<math.h>
double sum(int n)
{
        double s=0;
        for(int k=0;k<=20;k++)
        {
                double s1,s2,s3,s4;
                s1=(4.0/(8*k+1));
                s2=(2.0/(8*k+4));
                s3=(1.0/(8*k+5));
                s4=(1.0/(8*k+6));
                s+=pow(16.0,n-k)*(s1-s2-s3-s4);
        }
        return s;
}

int main(int argc, char* argv[])
{
        int c;
        printf("Введите порядковый номер цифры ");
        scanf("%i",&c);
        printf("Это цифра: %.90f \n",sum(c));
        
        return 0;
}
Несколько ответов
Цитата:
Введите порядковый номер цифры 0
Это цифра: 3.141592653589793115997963468544185 16159057617187500000000000000000000 0000000000
Введите порядковый номер цифры 1
Это цифра: 50.26548245743668985596741549670696 25854492187500000000000000000000000 0000000000
Введите порядковый номер цифры 2
Это цифра: 804.2477193189870376954786479473114 01367187500000000000000000000000000 0000000000
Введите порядковый номер цифры 3
Это цифра: 12867.96350910379260312765836715698 24218750000000000000000000000000000 0000000000
Введите порядковый номер цифры 4
Это цифра: 205887.4161456606816500425338745117 18750000000000000000000000000000000 0000000000
Введите порядковый номер цифры 5
Это цифра: 3294198.658330570906400680541992187 50000000000000000000000000000000000 0000000000
При вводе нуля в ответе видим число пи Должна быть тройка. Ладно, если округлить, то все нормально.
Вводим единицу. Получаем 50. Должно быть 1. А нет, стоп. Формула ведь ищет шестнадцатеричное число пи. пи16=3,243F6A8885A308D31319… Должна быть двойка, но никак не 50. Дальше все гораздо ужаснее. В чем косяк? Как без переполнения вычислить миллионный знак?
Изображения
Тип файла: png REwkKee.png (18.0 Кб, 67 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 18.12.2013, 14:53   #2
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Прошу прощение за то, что поднял тему. Есть хоть какие-нибудь мысли?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 18.12.2013, 15:40   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

http://habrahabr.ru/post/179829/
for(int k=0;k<=N;k++)
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 18.12.2013, 19:33   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
for(int k=0;k<=N;k++)
смысл в таком коде? Если мне нужна биллионная цифра, то свалюсь на ошибке переполнения, да и находить любое число таким методом глупо. Проще полностью все пи вычислять. На хабре(по вашей ссылке) написан алгоритм, который я пытаюсь реализовать.
Цитата:
Как же работает алгоритм вычисления N-го знака Пи?
К примеру, если нам нужен 1000-й шестнадцатеричный знак числа Пи, мы домножаем всю формулу на 16^1000, тем самым обращая множитель, стоящий перед скобками, в 16^(1000-k). При возведении в степень мы используем двоичный алгоритм возведения в степень или, как будет показано в примере ниже, возведение в степень по модулю. После этого вычисляем сумму нескольких членов ряда. Причём необязательно вычислять много: по мере возрастания k 16^(N-k) быстро убывает, так что, последующие члены не будут оказывать влияния на значение искомых цифр).
Я сделал все как автор сказал. Но не работает ведь.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 18.12.2013 в 19:37.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 18.12.2013, 19:49   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

на хабре рабочий код, а переполнение там убрано возведением по модулю
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 18.12.2013, 20:11   #6
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
на хабре рабочий код, а переполнение там убрано возведением по модулю
Не спортивно это Хотел сам, не списывая. Ладно пойду разбирать.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записать в Екселе цифры c степенью или индексом, так чтоб цифры считало, индексы (степень) игнор Andrew_K1982 Microsoft Office Excel 7 06.03.2013 23:10
2 в n-ной степени на Delphi Murman_men Помощь студентам 15 28.10.2011 21:01
Белая полоса в 2-ной рамке Syltan HTML и CSS 3 07.04.2010 14:57
Сортирует цифры по строкам, а надо чтобы сортировала цифры , записанные через пробелы Алексей_xXx Помощь студентам 14 06.05.2009 17:42
Программа для перевода из 16-ной с/c в 2-ную fult Паскаль, Turbo Pascal, PascalABC.NET 0 05.05.2009 21:57