|
Página 1 de 1
|
Realizar Un Programa Que Calcule PI Con While
Autor |
Mensaje |
Chema9879
Usuario
Registrado: Octobre 2019
Mensajes: 4
Edad: 24
|
Realizar Un Programa Que Calcule PI Con While
Calcular e imprimir el valor de pi con una aproximación de n iteraciones
Realizar con WHILE
Dim n As Long
Dim y As Float
Dim i As Long
Print"Dame el numero de decimales que quieres"
Input n
While i>10000
y=y+(((-1^n}/((2*n)+1)))
Input y
Wend
Print y
END
Me ayudarian a que me diera el resultado por favor.
|
#1 Jueves, 17 Octobre 2019, 01:23 |
|
|
Grandamakulo
Analista Programador
Registrado: Enero 2016
Mensajes: 311
Edad: 55 Ubicación: En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
|
Re: Realizar Un Programa Que Calcule PI Con While
Hola:
Me permito algunos comentarios sobre el código que nos pasas.
a) No lo has probado. Lo primero que ocurre es que tiene un error de sintaxis, ya que cierras con una llave un paréntesis.
b) Tienes un «input y» absolutamente innecesario dentro del bucle.
c) El bucle nunca arrancará, ya que comienza con la condición i>10000, e «i» comienza en «0» y no se modifica nunca en el código.
d) En cuanto al método de búsqueda, creo que el algoritmo está mal planteado, ya que es de sustitución directa y da lugar a inestabilidades. Si fuese el de Newton, todavía podría ser, pero, en ambos casos, calculas hasta los decimales que te dé el Float y sin condición de final sobre el resultado —o sea, paras cuando llegas a 10000 iteraciones independientemente de la precisión del resultado—. Para el cálculo de decimales individuales hay otros métodos. ¿Serías tan amable de indicar el planteamiento completo del problema?
PS.—Parece que estás usando la serie de Leibniz, ¿es así?
última edición por Grandamakulo el Jueves, 17 Octobre 2019, 10:13; editado 2 veces
|
#2 Jueves, 17 Octobre 2019, 09:59 |
|
|
gambafeliz
Analista Programador
Registrado: Julio 2019
Mensajes: 830
Edad: 54
|
Re: Realizar Un Programa Que Calcule PI Con While
Grandamakulo escribió: Hola:
Me permito algunos comentarios sobre el código que nos pasas.
a) No lo has probado. Lo primero que ocurre es que tiene un error de sintaxis, ya que cierras con una llave un paréntesis.
b) Tienes un «input y» absolutamente innecesario dentro del bucle.
c) El bucle nunca arrancará, ya que comienza con la condición i>10000, e «i» comienza en «0» y no se modifica nunca en el código.
d) En cuanto al método de búsqueda, creo que el algoritmo está mal planteado, ya que es de sustitución directa y da lugar a inestabilidades. Si fuese el de Newton, todavía podría ser, pero, en ambos casos, calculas hasta los decimales que te dé el Float y sin condición de final sobre el resultado —o sea, paras cuando llegas a 10000 iteraciones independientemente de la precisión del resultado—. Para el cálculo de decimales individuales hay otros métodos. ¿Serías tan amable de indicar el planteamiento completo del problema?
PS.—Parece que estás usando la serie de Leibniz, ¿es así?
Quillo vaya tela, me quedao anodadao por tu comentario. No te quito la razón. Pero
Oju
-Yo le fuera dicho Chema9879, allí en la jiuda le pegas un pellisco a la pare y se enciende la lu
Y ya esta
Niño que ta mal.
|
#3 Jueves, 17 Octobre 2019, 10:59 |
|
|
Grandamakulo
Analista Programador
Registrado: Enero 2016
Mensajes: 311
Edad: 55 Ubicación: En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
|
Re: Realizar Un Programa Que Calcule PI Con While
En vista de que nuestro compañero Chema9879 no da señales de vida —como era de esperar; y conste que lo entiendo perfectamente: yo también me iba a la cantina a jugar al dominó y luego tenía que hacer todos los «mandaos» en una sola tarde.— y que, por tanto, no nos contestará a los matices que le solicitábamos, creo que llega el momento de dar resolución con los datos que tenemos al problema —y que, como buen pedante, no me puedo resistir—.
En primer lugar, pienso que hay que establecer bien el enunciado. Digamos que podría ser:
«Realícese un programa en GAMBAS3 u otro BASIC similar que aproxime el valor de π a partir de la serie de Leibniz modificando el control de flujo con un bucle WHILE - WEND, siendo:
la definición de la serie de Leibniz —téngase en cuenta que la serie calcula π/4—.
La precisión deseada debe ser una variable de entrada.»
Vale que todos sabemos que calcular así el valor de π no sirve para nada, ya que siempre podremos hacer un [Public Const Pi As Float = 3.14159265358979] de no ser porque Pi ya es una función en Gambas3 cuyo argumento es el multiplicador de π —2*π es Pi(2)—; incluso, siendo mucho más arcaico, [Pi = 4 * ATan(1)]. Pero este problema es muy didáctico porque:
a) El resultado es más que conocido, por lo que sabremos si vamos o no bien.
b) Permite comparar la misma función con varias máquinas, esto es, comparar rendimientos de hardware; comparar distintas funciones en la misma máquina, esto es, comparar software —o ver si el pedante empollón de Miguel lo hace mejor que el campeón inter escuelas universitarias de Castilla La Mancha de dominó (no, yo no fui campeón de dominó), ¡pardiez!—.
c) Permite realizarlo con varios modificadores de flujo, aunque este caso caso nos lo pidan con While —yo prefiero siempre DO - LOOP por lo versatil—.
d) Además, está muy estudiado y permite aproximaciones por fórmulas explícitas, para «buscar» decimales; series explícitas, como el caso; series implícitas, para buscar recursividad. Y como es tan conocido, tenemos la referencia siempre a mano.
Y, por último, que el problema del enunciado NO es el de buscar los decimales de π, problema también interesante, sino de aproximar su valor.
Una solución posible podría ser esta:
Public Sub Main()
Dim fltDfE As Float ' Precisión, valor de paro. Ojo, que es de un cuarto de la solución
Dim fltPi4 As Float ' Acumulador del valor π/4
Dim fltEst As Float ' Diferencia entre un paso y el siguiente, equ. valor de un paso iteración
Dim n As Integer ' número de iteración
Input fltDfE ' por ejemplo fltDfE = 1e-7
fltPi4 = 0
fltEst = 1 + fltDfE ' Si en vez de WHILE - WEND se empleA DO - LOOP UNTIL nos ahorramos esta línea
n = 0
While Abs(fltEst) > fltDfE
fltEst = (-1 ^ n) / (2 * n + 1)
fltPi4 = fltPi4 + fltEst
n = n + 1
Wend
Print "π ~ "; fltPi4 * 4
Print "π = "; Pi
Print "Err= "; fltPi4 * 4 - Pi
Print "n = "; n
End
En ella se introduce la precisión desde la consola. Ése será el criterio de parada: cuando la diferencia entre un término y su anterior en valor absoluto sea menor que este número. La ventaja de usar series explícitas es que cada término de la serie es esa diferencia. Si no, habría que guardar el término anterior a n-1 y compararlo con el término actual a n, con lo que el criterio de parada sería |a n-a n-1|<dif
Obsérvese que el nombre correcto de este término es «diferencia» y no «error», aunque en muchos tratados, y yo mismo, hay veces que usemos tal nombre de manera indiferente. Pero esa «diferencia» se refiere, como se ha comentado a la que existe entre el término enésimo y su anterior, no a la que existe entre el valor real y el término enésimo.
El resto del programa es auto explicativo. Al final se imprime el resultado en la salida de consola convencional.
Se imprimen, por supuesto, el resultado, pero también el número de iteraciones para llegar al resultado.
|
#4 Sabado, 19 Octobre 2019, 22:05 |
|
|
Grandamakulo
Analista Programador
Registrado: Enero 2016
Mensajes: 311
Edad: 55 Ubicación: En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
|
Re: Realizar Un Programa Que Calcule PI Con While
Pero hay más cosas divertidas en torno a este problema. ¿Por qué se emplea la serie de Leibniz si es más lenta que el caballo del malo? Esto da lugar a un nuevo problema, también divertido: la optimación de la computación. ¿Por qué es interesante la serie de Leibniz? Lo importante es cómo lleva a la obtención de π. Poniendo un ejemplo más sencillo, véase la demostración de que raíz de dos no es racional. ¡Rediez!, sin numeración arábiga siquiera. —Vale, me estoy saliendo por la tangente de algunos temas, pero me gustaría que todo esto se pudiese encontrar en santa Güiqui porque nos supongo un poco vagos; para lo demás bastaría un par de buenos libros. Y sí, la serie de Leibniz viene explicada en santa Güiqui, pero es difícil de entender simplemente así, creo que resulta más instructivo el ejemplo de raíz de dos en «demostraciones», «reducción al absurdo»—.
Como digo, hay opciones mucho más rápidas, como la serie de Fórmula de Ramanujan:
Además, esta serie implica el cálculo de factoriales. Sin meternos en demasiado berenjenal, la función factorial se puede estudiar como función recursiva o como función explícita —la explícita es como un 8% más lenta que la implícita—:
Pero como en esta fórmula está vinculada al propio sumatorio, podemos ahorrarnos las llamadas externas, que son caras en tiempo, incluyendo el factorial en el sumatorio, lo que además evita tener que repetir los cálculos del factorial en cada iteración. Vamos, que lo solucionamos con un «acumulador» para n! — para 4*n! no sé cómo hacerlo, así es que hay que llamar a la función; a ver si mañana se me ocurre cómo simplificarlo Solucionado con la variable n4—:
Public Sub Main()
Dim fltDfE As Float ' Precisión, valor de paro. Ojo, que es el inverso de la solución
Dim fltPiI As Float ' Acumulador del valor 1/π
Dim fltEst As Float ' Diferencia entre un paso y el siguiente, equ. valor de un paso iteración
Dim n As Integer ' número de iteración
Dim k1 As Float = 1
Dim k4 As Float = 1
'Input fltDfE ' por ejemplo
fltDfE = 1e-8
fltPiI = 0
n = 0
Do
If n <> 0 Then
k1 = k1 * n
k4 = k4 * n4 * (n4 - 1) * (n4 - 2) * (n4 - 3) 'Factoriales.FactorialImplicito(4 * n)
End If
fltEst = (k4 * (26390 * n + 1103)) / (k1 ^ 4 * 396 ^ (4 * n))
fltPiI = fltPiI + fltEst
n = n + 1
Loop Until Abs(fltEst) < fltDfE
fltPiI = fltPiI * 2 * Sqr(2) / 9801
Print "π ~ "; 1 / fltPiI
Print "π = "; Pi
Print "Err= "; 1 / fltPiI - Pi
Print "n = "; n
End
En apenas tres iteraciones le lleva lo que a la de Leibniz 500.000.001 iteraciones. Lo juro. Probadlo.
última edición por Grandamakulo el Martes, 22 Octobre 2019, 10:54; editado 1 vez
|
#5 Sabado, 19 Octobre 2019, 22:07 |
|
|
gambafeliz
Analista Programador
Registrado: Julio 2019
Mensajes: 830
Edad: 54
|
Re: Realizar Un Programa Que Calcule PI Con While
Grandamakulo escribió: [align=justify]Pero hay más cosas divertidas en torno a este problema.
Lo siento
Pero no tengo mas remedio que decir...., que este foro esta lleno de marcianos. Y decian que la Nasa los descubrió no se cuando. Pero que va, en este país incluso viven y van de compras así como pasan por la cantina.
Esto no puede ser. Esto es un mal sueño.
Por cierto mis saludos, amigo Grandamakulo.
|
#6 Domingo, 20 Octobre 2019, 10:16 |
|
|
tincho
Analista Programador
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
|
Re: Realizar Un Programa Que Calcule PI Con While
Grandamakulo escribió: ...En apenas tres iteraciones le lleva lo que a la de Leibniz 500.000.001 iteraciones. Lo juro. Probadlo.
Esto esta tomando un nivel elevado.
Te felicito Grandamakulo, realmente una explicación y desarrollos trabajosos y aplicados.
Pero me temo que el iniciador de la pregunta no se merece ni un byte de escritura, mientras que no demuestre ciertas formas.
Saludos.
|
#7 Domingo, 20 Octobre 2019, 16:57 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Realizar Un Programa Que Calcule PI Con While
tincho escribió:
Pero me temo que el iniciador de la pregunta no se merece ni un byte de escritura, mientras que no demuestre ciertas formas.
Saludos.
Empiezo a pensar que es un bot
En fin, si sigue así ya sabéis lo que va a pasar
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#8 Martes, 22 Octobre 2019, 00:26 |
|
|
tincho
Analista Programador
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
|
Re: Realizar Un Programa Que Calcule PI Con While
jguardon escribió: tincho escribió:
Pero me temo que el iniciador de la pregunta no se merece ni un byte de escritura, mientras que no demuestre ciertas formas.
Saludos.
Empiezo a pensar que es un bot
En fin, si sigue así ya sabéis lo que va a pasar
Si, la verdad que yo pensé también que era un bot.
Ya sea o no un bot esta forma de interactuar con el foro no me agrada nada. Es que cuando uno llega a un sitio dice, hola buenas tardes soy fulano/a que tal les va. etc. etc. ya si alguien no hace eso no merece el mínimo de atención, es mi opinión.
Saludos.
|
#9 Martes, 22 Octobre 2019, 09:33 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|