Автор Тема: С++ програма за изчисляване на числото Пи!  (Прочетена 26987 пъти)

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Здравейте на всички!
От доста време исках да намеря програма, която да ми покаже до кое число след запетаята ще изчисли Пи (22/7 = 3.141592...) Т.е. дефакто ми трябва програма-калкулатор, която да няма ограничение за знаци и да дели 22 на 7.
Е, така и не намерих такава програма, затова вчера реших сам да си я напиша. Написах си кода с Visual C++ v.6.0. Всичко си му е наред на кода, но възникна една грешка... Закръгля числото. Т.е. като частно на 22/7 изкарва 3. Някой има ли идея как да направя така, че да не го закръгля и да изкара безброй много знаци?

Забележка! Безброй много се подразбира толкова, колкото може да изчисли компютъра ми! Японците заявиха още преди 2 години, че ще създадат машина, която да изчисли Пи до 1 трилионния знак след запетаята... Сегашния рекорд на Гинес не помня колко знаци беше. :)

Надявам се някой да помогне! Мерси за вниманието!

А ето и кода на програмата ми:
#include<iostream.h>

int main()
{
double a = 22;
double b = 7;

double s = 22/7;
cout << "s=" << s << "\n";
return(0);
}
Роботиката не е хоби - тя е начин на живот!

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #1 -: Юли 31, 2007, 02:29:15 pm »
Това е доста малка точност, най - много до 15 знак да го изкараш :) Този проблем е сериозно предизвикателство в средите на информатиците. Ако ползваш език като Рубик твоя алгоритъм би свършил идеална работа, защото рубик няма ограничение на типа, смята дори и 100! :) Но ще сметнеш до този знак, до който ти стига рама на пц-то :) В С++ се ползва друг метод. Създава се клас, които представлява нов числов тип и си дефинираш сам операциите върху него. След това описваш делението както го правиш на ръка с опашка, могат да се приложат някои и други оптимизация, но да не ти пълна главата с излишна информация:)
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
С++ програма за изчисляване на числото Пи!
« Отговор #2 -: Август 01, 2007, 03:43:23 pm »
Цитат на: "sv_shady"
Ако ползваш език като Рубик твоя алгоритъм би свършил идеална работа, защото рубик няма ограничение на типа, смята дори и 100! :) Но ще сметнеш до този знак, до който ти стига рама на пц-то :) В С++ се ползва друг метод.


Светльо, би ли ми дал малко повече информация за въпросния език "Рубик"? :) Мерси!
Роботиката не е хоби - тя е начин на живот!

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #3 -: Август 01, 2007, 04:29:04 pm »
Ами езикът Рубик е създаден някъде 60те години на миналия век от американските военни. Интересното при него е, че няма оператор за цикъл, а има така наречените генератори на числа, трябва доста абстрактно мислене, за да се схване. Освен това няма обособяване на различни числови типове и няма теоритическо ограничени на стойността им. Последната събота от вече миналата учебна година, господина по информатика, който ни подготвя за сътезанията, реши да ни позанимава с него. Вече не помня кой почти нищо като синтаксис, но от него се научих на някои полезни идеи :)
Може да потърсиш в гоогле за Rubic за синтаксиса не може да не намериш нищо, но пък за компилатор не знам. Господина беше писал някакъв преводач, който позволяваше след това да компилираме под ДОС или с някой компилатор под gcc.
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

jooorooo

  • Робо-Новак
  • *****
  • Публикации: 15
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #4 -: Август 01, 2007, 09:41:37 pm »
Каквито и функции да правя все става ето това :-( май компа ми е много глупав..

3,1428571428571427937015414499910548329353332519531250

П.П. махнах около 3000 нули отзад. Смятано на PHP

spookyboy

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #5 -: Август 18, 2007, 11:31:28 pm »
Приятели, 22/7 е точно до втория знак, така че не се мъчете по този начин ;) Хвърлете по едно око в Wikipedia за изчисляването на PI и за това дали има голям смисъл да си го смятате сами, вместо да ползвате от някъде готова константа (едва ли ще ви е нужна по голяма точност от 10 знака след десетичната запетая) :)
И все пак ето една програмка която писах преди време по една от формулите във Wikipedia :
#include <cstdio>

int main ()
{
double pi = 0;
const double iterations = 1000000;
double i;
for (i = 1; i < iterations; i += 4)
pi += 4/i - 4/(i+2);
printf ("%.15lf\n", pi);
return 0;
}


относно проблема със закръглянето вместо s = 22/7;
трябва да напишеш s = a/b;в твоя случай или да направиш каст на числата които делиш така че да се подразбират като double вместо int:s = (double)22/7; или s = (double)(22) / (double)(7);

Също така относно споменатия от sv_shady език Rubic предполагам че е имал това впредвид: Ruby.
Но все пак езикът не беше Ruby, а Icon :) Ако някой има интерес мога да му пратя нещо като компилатор и няколко примерни програмки :)
cheers :)
Станьо - 20г. - извън чужбина

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
С++ програма за изчисляване на числото Пи!
« Отговор #6 -: Август 19, 2007, 08:43:45 am »
Цитат на: "spookyboy"
#include <cstdio>

int main ()
{
double pi = 0;
const double iterations = 1000000;
double i;
for (i = 1; i < iterations; i += 4)
pi += 4/i - 4/(i+2);
printf ("%.15lf\n", pi);
return 0;
}


Здрасти! Имам няколко въпроса, относно този код. Би ли обяснил значението на функцията const double iterations = :sos: И всъщност... printf(); може ли да се замени със cout << ...;
Всичко останало като че ли е ясно. :)
Роботиката не е хоби - тя е начин на живот!

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #7 -: Август 19, 2007, 10:35:19 am »
Ами const double iterations = 1000 всъщност дефинира променлива от тип double с име iterations и стойност 1000, но това е по - интересна променлива - тя е константа. Никъде из сорса не можеш да променяш стойността и. Принципно cout e аналогично на printf само, че printf e на С, а cout на С++. Освен това printf има различен синтаксис от cout, а и е по бързо :)
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

INF1n1t

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 139
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #8 -: Август 28, 2007, 01:05:16 pm »
Хубаво, само дето има един проблем. 22/7 НЕ е ПИ. Не знам, но доколкото видях темата, основната грешка е че мислите, че 22/7 е пи. Това не е така.

http://infinit.11.forumer.com/viewtopic.php?t=141

Повече информация по въпроса...
Иван Занев - град София

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
С++ програма за изчисляване на числото Пи!
« Отговор #9 -: Август 28, 2007, 02:04:51 pm »
Цитат
В Евклидовата геометрия π може да бъде дефинирано както като отношение между обиколката и диаметъра на една окръжност, така и като отношение на лицето на една окръжност към лицето на квадрат със страна нейния радиус. Във висшата математика π се дефинира аналитично чрез използване на тригонометрични функции, например като най-малкото положително x, за което sin(x)=0, или като удвоеното най-малко положително x, за което cos(x)=0. Всички тези дефиниции са еквивалентни.

Числото π е приблизително равно на 22/7 или 3,14 с точност до третата значеща цифра.

Числовата стойност на π, закръглена до 69-тия знак след десетичната запетая, е:

3,14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230  7816...
Въпреки че тази точност е повече от достатъчна за използване в науката и техниката, през последните няколко века в изчисляването на повече цифри и изследването на свойствата на числото са положени много усилия. Независимо от многото аналитична работа, прибавена към изчисленията със суперкомпютри, определили повече от 1 трилион цифри на π, не е намерена закономерност в поредицата от цифри. Цифрите на π могат да се намерят на много места в Интернет и обикновен персонален компютър може да изчисли милиарди цифри с наличния софтуер.
Приблизителни стойности на Пи, изразени в обикновена дроб са: 22/7 (според Архимед) и 355/113 (по оценка на древните китайски математици).


Пи е приблизително 22/7, но програмата на C++ закръгля стойностите. :)
Поздрави!
Роботиката не е хоби - тя е начин на живот!

Methuselah

  • Вече знае какво е робот!
  • *****
  • Публикации: 67
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #10 -: Септември 04, 2007, 05:03:11 pm »
Момчета знам че са минали вече 5 дена, но забелязах че никой (или поне никой не е писал) не е сметнал 22/7 на ръка. Ако бяхте, щяхте да забележите че определено не е пи:
22/7 = 3.142857142857142857...
тоест е периодична дроб, а пи е непериодична.
Явно прекалено много сме свикнали с компютрите и сме забравили да смятаме на ръка  :D

И понеже видях че е имало дискусии и за 'синтаксиса' на програмата, та да се изкажа:
double s;
s = 22/7;

става следното нещо: 22 и 7 се възприемат като int и се получава 3.1428..., но се съкращава частта след запетаята и се получава 3. Това 3 се подава на s, заради което се превръща в 3.00 (double), но като се печата се пренебрегва .00

Това което spookyboy е писал е вярно, но може да се направи и по по-лесен начин: просто пишем 22.0 / 7.0
Така компилатора възприема числата като double и връща като резултат double. Това опростява кода и спестява няколко преобразувания.

Надявам се че съм бил полезен.

INF1n1t

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 139
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #11 -: Септември 04, 2007, 08:33:35 pm »
Цитат на: "Methuselah"
Момчета знам че са минали вече 5 дена, но забелязах че никой (или поне никой не е писал) не е сметнал 22/7 на ръка. Ако бяхте, щяхте да забележите че определено не е пи:
22/7 = 3.142857142857142857...
тоест е периодична дроб, а пи е непериодична.
Явно прекалено много сме свикнали с компютрите и сме забравили да смятаме на ръка  :D

И понеже видях че е имало дискусии и за 'синтаксиса' на програмата, та да се изкажа:
double s;
s = 22/7;

става следното нещо: 22 и 7 се възприемат като int и се получава 3.1428..., но се съкращава частта след запетаята и се получава 3. Това 3 се подава на s, заради което се превръща в 3.00 (double), но като се печата се пренебрегва .00

Това което spookyboy е писал е вярно, но може да се направи и по по-лесен начин: просто пишем 22.0 / 7.0
Така компилатора възприема числата като double и връща като резултат double. Това опростява кода и спестява няколко преобразувания.

Надявам се че съм бил полезен.


 Хахаха, интересното тук е че и аз го казах, а не се усетих, че преди мене са го казали. Няма смисъл да го смяташ на ръка - въведи си го в калкулатора (ако си на Windows) и ти го смята...
 Тоест, вече трима човека казаха че 22/7 не е пи.
Иван Занев - град София

spookyboy

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #12 -: Септември 14, 2007, 02:20:45 pm »
Междудругото 355/113 е по близо до Пи, който го вълнува :P
Станьо - 20г. - извън чужбина

profesora

  • Вече знае какво е робот!
  • *****
  • Публикации: 48
    • Профил
    • http://www.shapshalinco.hit.bg
С++ програма за изчисляване на числото Пи!
« Отговор #13 -: Септември 14, 2007, 04:28:07 pm »
Не е въпроса кое е по близо до ПИ въпроса е че тази вебичина е съществувала много преди нас и хората са го казали а и числото е приблизително 3,14 а не точно
Михаил Петров
                  гр.Пловдив

INF1n1t

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 139
    • Профил
С++ програма за изчисляване на числото Пи!
« Отговор #14 -: Септември 14, 2007, 05:31:16 pm »
spookyboy мисля че в темата беше споменато, но не съм сигурен. Колкото по-големи числа ползваш, толкова повече ще изчистваш ПИ. Така е и със ФИ, но там поне знаеш кои числа да ползваш...
Иван Занев - град София