Форум по Роботика

Офтопик => За всичко... => Темата е започната от: Borislav в Юли 31, 2007, 10:51:31 am

Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: Borislav в Юли 31, 2007, 10:51:31 am
Здравейте на всички!
От доста време исках да намеря програма, която да ми покаже до кое число след запетаята ще изчисли Пи (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 в Юли 31, 2007, 02:29:15 pm
Това е доста малка точност, най - много до 15 знак да го изкараш :) Този проблем е сериозно предизвикателство в средите на информатиците. Ако ползваш език като Рубик твоя алгоритъм би свършил идеална работа, защото рубик няма ограничение на типа, смята дори и 100! :) Но ще сметнеш до този знак, до който ти стига рама на пц-то :) В С++ се ползва друг метод. Създава се клас, които представлява нов числов тип и си дефинираш сам операциите върху него. След това описваш делението както го правиш на ръка с опашка, могат да се приложат някои и други оптимизация, но да не ти пълна главата с излишна информация:)
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: Borislav в Август 01, 2007, 03:43:23 pm
Цитат на: "sv_shady"
Ако ползваш език като Рубик твоя алгоритъм би свършил идеална работа, защото рубик няма ограничение на типа, смята дори и 100! :) Но ще сметнеш до този знак, до който ти стига рама на пц-то :) В С++ се ползва друг метод.


Светльо, би ли ми дал малко повече информация за въпросния език "Рубик"? :) Мерси!
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: sv_shady в Август 01, 2007, 04:29:04 pm
Ами езикът Рубик е създаден някъде 60те години на миналия век от американските военни. Интересното при него е, че няма оператор за цикъл, а има така наречените генератори на числа, трябва доста абстрактно мислене, за да се схване. Освен това няма обособяване на различни числови типове и няма теоритическо ограничени на стойността им. Последната събота от вече миналата учебна година, господина по информатика, който ни подготвя за сътезанията, реши да ни позанимава с него. Вече не помня кой почти нищо като синтаксис, но от него се научих на някои полезни идеи :)
Може да потърсиш в гоогле за Rubic за синтаксиса не може да не намериш нищо, но пък за компилатор не знам. Господина беше писал някакъв преводач, който позволяваше след това да компилираме под ДОС или с някой компилатор под gcc.
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: jooorooo в Август 01, 2007, 09:41:37 pm
Каквито и функции да правя все става ето това :-( май компа ми е много глупав..

3,1428571428571427937015414499910548329353332519531250

П.П. махнах около 3000 нули отзад. Смятано на PHP
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: spookyboy в Август 18, 2007, 11:31:28 pm
Приятели, 22/7 е точно до втория знак, така че не се мъчете по този начин ;) Хвърлете по едно око в Wikipedia (http://en.wikipedia.org/wiki/Pi) за изчисляването на 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 (http://en.wikipedia.org/wiki/Ruby_%28programming_language%29).
Но все пак езикът не беше Ruby, а Icon (http://en.wikipedia.org/wiki/Icon_%28programming_language%29) :) Ако някой има интерес мога да му пратя нещо като компилатор и няколко примерни програмки :)
cheers :)
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: Borislav в Август 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 в Август 19, 2007, 10:35:19 am
Ами const double iterations = 1000 всъщност дефинира променлива от тип double с име iterations и стойност 1000, но това е по - интересна променлива - тя е константа. Никъде из сорса не можеш да променяш стойността и. Принципно cout e аналогично на printf само, че printf e на С, а cout на С++. Освен това printf има различен синтаксис от cout, а и е по бързо :)
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: INF1n1t в Август 28, 2007, 01:05:16 pm
Хубаво, само дето има един проблем. 22/7 НЕ е ПИ. Не знам, но доколкото видях темата, основната грешка е че мислите, че 22/7 е пи. Това не е така.

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

Повече информация по въпроса...
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: Borislav в Август 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 в Септември 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 в Септември 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 в Септември 14, 2007, 02:20:45 pm
Междудругото 355/113 е по близо до Пи, който го вълнува :P
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: profesora в Септември 14, 2007, 04:28:07 pm
Не е въпроса кое е по близо до ПИ въпроса е че тази вебичина е съществувала много преди нас и хората са го казали а и числото е приблизително 3,14 а не точно
Титла: С++ програма за изчисляване на числото Пи!
Публикувано от: INF1n1t в Септември 14, 2007, 05:31:16 pm
spookyboy мисля че в темата беше споменато, но не съм сигурен. Колкото по-големи числа ползваш, толкова повече ще изчистваш ПИ. Така е и със ФИ, но там поне знаеш кои числа да ползваш...