{"id":401,"date":"2026-03-07T00:06:52","date_gmt":"2026-03-07T00:06:52","guid":{"rendered":"https:\/\/hackcuba.net\/?p=401"},"modified":"2026-03-07T00:06:52","modified_gmt":"2026-03-07T00:06:52","slug":"algoritmo-para-hallar-pi","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=401","title":{"rendered":"Algoritmo para hallar Pi"},"content":{"rendered":"\n<p>Seguramente todos los lectores han o\u00eddo mencionar este n\u00famero denominado con la letra griega \u03c0 (Pi). Frecuentemente utilizado por los matem\u00e1ticos, f\u00edsicos, arquitectos e ingenieros, nos ha devuelto tanto soluciones como fuertes dolores de cabeza. A continuaci\u00f3n publicamos un algoritmo que permite calcular el valor exacto de Pi hasta 10 000 cifras decimales; lo dem\u00e1s s\u00f3lo depende del nivel de procesamiento de la computadora donde se ejecute el programa.<\/p>\n\n\n\n<!--more-->\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &lt;iostream&gt;\n#include &lt;fstream&gt;\n#include &lt;cstdio&gt;\n\nusing namespace std;\n\n\/*\nCalculando un gran n\u00famero:\nElaborado por Harvin Manuel Toledo\nBasado en la p\u00e1gina de: Xavier Gourdon\nharvin_t@hotmail.com, harvin_t@yahoo.es\n\nEmple\u00e9 dos formulas para comprobar que el programa no se equivoca:\npi=4*(4*arctan(1\/5)-arctan(1\/239))\npi=4*(arctan(1\/2)+arctan(1\/3))\ny usando la f\u00f3rmula arctan(x)=x-x^3\/3+x^5\/5-x^7\/7+x^9\/9. Esta es llamada tambi\u00e9n\nla serie de Leibniz.\nPara hacer un c\u00e1lculo m\u00e1s r\u00e1pido podemos usar las identidades\nsiguientes para comprobar nuestro c\u00e1lculos\n\nEstas f\u00f3rmulas fueron usadas por Yasumasa Kanada en el r\u00e9cord que rompi\u00f3 en 2002\nen Tokio, Jap\u00f3n con m\u00e1s de un bill\u00f3n de cifras de Pi\npi=48*arctan(1\/49)+128*arctan(1\/57)-20*arctan(1\/239)+48*arctan(1\/110443)\npi=176*arctan(1\/57)+28*arctan(1\/239)-48*arctan(1\/682)+96*arctan(1\/12943)\n*\/\n\n\/\/definir la base en la que se har\u00e1n las operaciones\n\nconst long B=10000;\nconst long LB=4;\nconst long Digitos=10000; \/\/si alteras este n\u00famero obtendr\u00e1s m\u00e1s digitos\n\n\/\/Declaraciones\nvoid Imprimir(long, long *);\nvoid Archivar(long, long *);\nvoid Mult(long, long *, long);\nvoid Div(long, long *, long);\nvoid Sum(long , long *, long *);\nvoid Rest(long , long *, long *);\nvoid HacerEntero(long, long *, long);\nbool EsCero(long, long *);\n\nint main()\n  {\n  bool signo;\n  long *arctan1, *arctan2, *pi, *term;\n  long k;\n  long tam;\n\n  tam=Digitos\/LB+1;\n  arctan1=new long&#x5B;tam];\n  arctan2=new long&#x5B;tam];\n  pi=new long&#x5B;tam];\n  term=new long&#x5B;tam];\n\n  cout&lt;&lt;&quot;Memoria reservada con \u00e9xito&quot;&lt;&lt;endl;\n  cout&lt;&lt;&quot;El programa ha comenzado a calcular, espere un momento...&quot;&lt;&lt;endl;\n\n  HacerEntero(tam, arctan1, 0);\n  HacerEntero(tam, arctan2, 0);\n  HacerEntero(tam, pi, 0);\n\n  k=1;\n  signo=false;\n  HacerEntero(tam, term, 1);\n  Div(tam, term, 5);\n  Sum(tam, arctan1, term);\n  while(!EsCero(tam, term))\n  {\n    Div(tam, term, 25);\n    Div(tam, term, 2*k+1);\n    if(signo)\n    Sum(tam, arctan1, term);\n    else\n    Rest(tam, arctan1, term);\n    if(signo)\n    signo=false;\n    else\n    signo=true;\n    Mult(tam, term, 2*k+1);\n    k++;\n  }\n  Mult(tam, arctan1, 4);\n\n  k=1;\n  signo=false;\n  HacerEntero(tam, term, 1);\n  Div(tam, term, 239);\n  Sum(tam, arctan2, term);\n  while(!EsCero(tam, term))\n  {\n    Div(tam, term, 57121);\n    Div(tam, term, 2*k+1);\n    if(signo)\n    Sum(tam, arctan2, term);\n    else\n    Rest(tam, arctan2, term);\n    if(signo)\n    signo=false;\n    else\n    signo=true;\n    Mult(tam, term, 2*k+1);\n    k++;\n  }\n\n  Sum(tam, pi, arctan1);\n  Rest(tam, pi, arctan2);\n  Mult(tam, pi, 4);\n\n  Imprimir(tam, pi);\n  Archivar(tam, pi);\n  cin.ignore();\n\n  delete&#x5B;] arctan1;\n  delete&#x5B;] arctan2;\n  delete&#x5B;] term;\n  delete&#x5B;] pi;\n}\n\nvoid Imprimir(long n, long *x)\n{\n  long i=0;\n\n  printf(&quot;%d.&quot;, x&#x5B;0]);\n  for(i=1; i&lt;n-1; i++)\n  printf(&quot;%.4d&quot;, x&#x5B;i]);\n}\n\nvoid Archivar(long n, long *x)\n{\n  FILE *pArchivo;\n\n  pArchivo=fopen(&quot;pi.txt&quot;, &quot;w&quot;);\n  long i=0;\n\n  fprintf(pArchivo, &quot;Elaborado por harvin toledo\\n&quot;);\n  fprintf(pArchivo, &quot;El valor pi es: &quot;);\n  fprintf(pArchivo, &quot;%d.&quot;, x&#x5B;0]);\n\n  for(i=1; i&lt;n-1; i++)\n  fprintf(pArchivo, &quot;%.4d&quot;, x&#x5B;i]);\n  fclose(pArchivo);\n}\n\n\/* Esta funci\u00f3n multiplica un gran n\u00famero por un entero com\u00fan\nno mayor que sizeof(long),\nel resultado es almacenado en el mismo x\n*\/\nvoid Mult(long n, long *x, long q)\n{\n  long i=0;\n  long lleva=0, xi;\n\n  for(i=n-1; i&gt;=0; i--)\n  {\n    xi=x&#x5B;i]*q+lleva;\n    if(xi&gt;B)\n    {\n      lleva=xi\/B;\n      xi-=lleva*B;\n    }\n    else\n    lleva=0;\n    x&#x5B;i]=xi;\n  }\n\n  x&#x5B;0]+=lleva*B;\n}\n\n\/* Esta funcion divide un gran n\u00famero por un entero com\u00fan\nno mayor que sizeof(long)\nel resultado es almacenado en el mismo x\n*\/\nvoid Div(long n, long *x, long q)\n{\n  long i, lleva=0, xi;\n  \n  for(i=0; i&lt;n; i++)\n  {\n    xi=x&#x5B;i]+lleva*B;\n    x&#x5B;i]=xi\/q;\n    lleva=xi-x&#x5B;i]*q;\n  }\n}\n\n\/* Esta funci\u00f3n suma un gran n\u00famero en multiprecisi\u00f3n con otro\ndel mismo tipo y el resultado lo almacena en el primero o sea x\n*\/\nvoid Sum(long n, long *x, long *y)\n{\n  long i, lleva=0;\n  for(i=n-1; i&gt;=0; i--)\n  {\n    x&#x5B;i]+=y&#x5B;i]+lleva;\n    if(x&#x5B;i]&gt;=B)\n    {\n      x&#x5B;i]-=B;\n      lleva=1;\n    }\n  else\n  lleva=0;\n  }\n}\n\n\/*Esta funci\u00f3n resta dos n\u00fameros en multiprecisi\u00f3n\ny almacena el nuevo resultado en el primero*\/\n\nvoid Rest(long n, long *x, long *y)\n{\n  long i, lleva=0;\n  for(i=n-1; i&gt;=0; i--)\n  {\n    x&#x5B;i]=x&#x5B;i]-y&#x5B;i]-lleva;\n    if(x&#x5B;i]&lt;0)\n    {\n      x&#x5B;i]+=B;\n      lleva=1;\n    }\n  else\n  lleva=0;\n  }\n}\n\n\/*Esta funci\u00f3n convierte un entero menor que sizeof(long),\nen un entero con multiprecisi\u00f3n*\/\nvoid HacerEntero(long n, long *x, long Entero)\n{\n  long i;\n  x&#x5B;0]=Entero;\n  for(i=1; i&lt;n; i++)\n  x&#x5B;i]=0;\n}\n\n\/\/Esta funci\u00f3n averigua si un n\u00famero en multiprecisi\u00f3n\n\/\/es igual a cero o no\nbool EsCero(long n, long *x)\n{\n  long i;\n  for(i=0; i&lt;n; i++)\n  {\n    if(x&#x5B;i])\n    return false;\n  }\n  return true;\n}\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Seguramente todos los lectores han o\u00eddo mencionar este n\u00famero denominado con la letra griega \u03c0 (Pi). Frecuentemente utilizado<\/p>\n","protected":false},"author":2,"featured_media":376,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,18,36],"tags":[60,135,38],"class_list":["post-401","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigos","category-programacion","category-proyecto-blackhat","tag-c","tag-pi","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/401","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=401"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/401\/revisions"}],"predecessor-version":[{"id":402,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/401\/revisions\/402"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/376"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}