Cálculo de pi con algoritmo de Borwein en PYTHON

Dudas y comentarios sobre otros lenguajes de programación. Si algún lenguaje recibe suficientes preguntas le añadimos nueva categoría.
Responder
Mensaje
Autor
Avatar de Usuario
leosan
Mensajes: 730
Registrado: 19/04/2012 8:35 am
Ubicación: GRAN CANARIA

Cálculo de pi con algoritmo de Borwein en PYTHON

#1 Mensaje por leosan » 26/02/2013 12:35 pm

En una respuesta a untio referida al cálculo de pi propuse el método de Euler, pero con resultados "pobres" en cuanto a cantidad de cifras exactas. Así que buscando encontré un método iterativo llamado algoritmo de Borwein, que teóricamente cuadruplica las cifras obtenidas en cada iteración. Pero ni pa´dios me salen las cifras que indican. Y mi duda está si el lenguaje es el que hace impreciso el cálculo o la potencia del ordenador, que no creo ya que con el programa SUPER PI si me salen. ..... ¿alguien podría comprobar si sale lo que promete el algoritmo en su ordenador?

Paso el código, que como indico en el enunciado, aquí está en Python 3.x:

Código: Seleccionar todo

#Borwein's algorithm (1985)
'''and it has the impressive quartic rate of convergence(each successive iteration
quadruples the number of correct digits). The first two iterates are
Algorithm  

yk+1=1-( 1-yk^4) ^1/41+(1-yk^4) ^1/4
ak+1=(1+yk+1)^4*ak-2^(2k+3)*yk+1*(1+yk+1+yk+1^2),
starting with

y0 = sqrt2-1,a0 = 6-4sqrt2,

 The first two iterates are Algorithm : 
1/a1=3.1415926(462...)
1/a2=3.1415926535897932384626433832795028841971(146...)'''


from math import sqrt
a=6-4*sqrt(2)
y=sqrt(2)-1
for n in range (10):
    y1=(1-(1-y**4)**(1/4))/(1+(1-y**4)**(1/4))
    a1=((1+y1)**4)*a-(2**(n+3))*y1*(1+y1+y1**2)
    a=a1
    y=y1
a2=1/a1
print ("%1.50f" % a2)    
print ()
Podéis encontrarlo en:

http://en.wikipedia.org/wiki/Borwein%27s_algorithm
http://numbers.computation.free.fr/Cons ... ivePi.html

Gracias por la atención y ¡ ¡ ¡ espero opiniones¡ ¡ ¡ .

Saluditos!. ... Imagen

P.D: Este no es el único intento, más bien el n-ésimo y todos con "pobres" resultados en cantidad de cifras exactas, insisto.

Por ejemplo, también he usado el método de fracciones continuas que aparentemente iría bien:
Imagen

con el correpondiente código:

Código: Seleccionar todo

i =100000
j=99998
pi=((6+(2*5-1)**2)**(-1))*(2*4-1)**2
print ("%1.50f" % pi)
while (2*j-1) > 0:
    pi=(6+pi)**(-1)*((2*j-1)**2)
    j-=1
pi+=3
print ("%1.50f" % pi)
print ()
Pero nada de nada, unas diez o quince cifras solamente.

Me pica la curiosidad, ¿ atí no?. ...Imagen

P.D:P.D: Seré torpe, el problema radica en la falta de precisión de los números en coma flotante: 0.1+0.1+0.1-0.3=5.551115123125783e-17

Tendría que usar números enteros y al final pasarlo a flotante. No obstante sigo abierto a sugerencias. :wink:
Última edición por leosan el 27/02/2013 10:03 am, editado 1 vez en total.

Avatar de Usuario
leosan
Mensajes: 730
Registrado: 19/04/2012 8:35 am
Ubicación: GRAN CANARIA

Re: Cálculo de pi con algoritmo de Borwein en PYTHON

#2 Mensaje por leosan » 27/02/2013 9:58 am

O mejor aún, trabajar en binario, así creo que no perdería ninguna cifra.

No obstante sigo abierto a sugerencias. :wink:

P.D: Estoy "espeso". No se ha editado en el anterior post. Sorry.

paolorod
Mensajes: 1
Registrado: 22/06/2018 3:58 pm

Re: Cálculo de pi con algoritmo de Borwein en PYTHON

#3 Mensaje por paolorod » 22/06/2018 4:02 pm

Como se trabajaría en binario en este caso? Si yo hago uso de python como haría? o tendría que tratar de usar un lenguaje diferente o quizás una librería?

mollok
Mensajes: 466
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Cálculo de pi con algoritmo de Borwein en PYTHON

#4 Mensaje por mollok » 23/06/2018 8:23 am

Es debido al estándar usado para los números decimales. Si quieres mucha precisión tendrías que inventar un nuevo tipo de dato. Pero ya que en Python un entero puede tener un tamaño muy grande solo debería marcarse en que posición cae la cima decimal y hacer alrededor de esa idea todo el aparato para realizar operaciones matemáticas.
Pero bueno, eso es sólo una idea que hay que desarrollar, y yo no soy de Python.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado