Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Realizar Un Programa Que Calcule PI Con While
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
Chema9879 - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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, 11:13; editado 2 veces 
Grandamakulo - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Realizar Un Programa Que Calcule PI Con While 
 
Grandamakulo escribió: [Ver mensaje]
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.
 



 
gambafeliz - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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:
 37ad291358d3106556bd86b84c114685445cf901
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 an-1 y compararlo con el término actual an, con lo que el criterio de parada sería |an-an-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.

 



 
Grandamakulo - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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:
 49a59057b013e0f53abf350f5db0a6d7917eba56
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—:

Public Function FactorialExplicito(n As Integer) As Float
  
  Dim i As Integer
  Dim fltFac As Float
  
  fltFac = 1
  
  For i = 2 To n
    fltFac = fltFac * i
  Next
  
  Return fltFac
  
End

Public Function FactorialImplicito(n As Integer) As Float

  If n > 1 Then
      Return n * FactorialImplicito(n - 1)
    Else
      Return 1
  Endif

End


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, 11:54; editado 1 vez 
Grandamakulo - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Realizar Un Programa Que Calcule PI Con While 
 
Grandamakulo escribió: [Ver mensaje]
[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.
 



 
gambafeliz - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Realizar Un Programa Que Calcule PI Con While 
 
Grandamakulo escribió: [Ver mensaje]
...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.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Realizar Un Programa Que Calcule PI Con While 
 
tincho escribió: [Ver mensaje]

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"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Realizar Un Programa Que Calcule PI Con While 
 
jguardon escribió: [Ver mensaje]
tincho escribió: [Ver mensaje]

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.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Problemas Al Realizar Consulta A SQLServer fdittel Bases de Datos 2 Viernes, 27 May 2011, 21:09 Ver último mensaje
fdittel
No hay nuevos mensajes Manual Básico Para Realizar Controles jsbsan Controles/Librerías/Componentes 6 Sabado, 05 May 2012, 12:51 Ver último mensaje
jsbsan
No hay nuevos mensajes Problemas Al Realizar Consulta A SQLServer... fdittel Bases de Datos 3 Jueves, 23 Junio 2011, 23:06 Ver último mensaje
fdittel
No hay nuevos mensajes Equema Para Realizar Una Aplicación En Ga... jsbsan General 4 Martes, 28 Agosto 2012, 13:23 Ver último mensaje
jsbsan
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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
No puede descargar archivos
No puede publicar eventos en el calendario