On Wed, 20 Mar 2013 14:02:02 +0100
Chema Cortes <[email protected]> wrote:

> El día 20 de marzo de 2013 13:19, José Sabater Montes <[email protected]>
> escribió:
> >
> > Hola,
> >
> > El 20/03/2013, a las 11:00, Chema Cortes escribió:
> >
> >> Supongo que habrá una explicación. Si realizo el siguiente cálculo:
> >>
> >> In [13]: import math
> >>
> >> In [14]: math.tan(math.pi/2)
> >> Out[14]: 1.633123935319537e+16
> >>
> >> Aunque no esperaba que me diese la solución correcta de
> >> float("+inf")/float("-inf"), me resulta muy corto para el tamaño
> >> máximo que podría tener un double:
> >>
> >> In [16]: sys.float_info.max
> >> Out[16]: 1.7976931348623157e+308
> >>
> >> He comprobado que pasa lo mismo con scala e, incluso, en el
> >> buscador de google (tal vez sea que google usa también python):
> >>
> >> https://www.google.com/search?q=tan(pi%2F2)
> >>
> >> ¿Existe alguna explicación?
> >
> >>>> import math
> >>>> math.pi/2.
> > 1.5707963267948966
> >
> > Aparentemente la tangente de ese número con esa precisión es
> > exactamente esa calculando con la precisión de un float. Para
> > aumentar la precisión creo que hay que usar una librería que
> > ofrezca precisión arbitraria como el módulo "decimal" de la
> > librería estándar o mpmath. El problema con "decimal" es que no
> > implementa funciones matemáticas un poco más complejas como las
> > trigonométricas, así que el resultado de la tangente sería el mismo
> > si se usan las mismas funciones que antes.
> >
> >>>> from decimal import Decimal
> >>>> pi_dec =
> >>>> Decimal('3.1415926535897932384626433832795028841971693993751')
> >>>> pi_dec
> > Decimal('3.1415926535897932384626433832795028841971693993751')
> >>>> pi_dec/Decimal('2')
> > Decimal('1.570796326794896619231321692')
> >>>> math.tan(pi_dec/Decimal('2'))
> > 1.633123935319537e+16
> >
> > Si no me equivoco, las funciones trigonométricas se suelen calcular
> > usando series. Una buena librería de precisión arbitraria (supongo
> > que todas) irá adaptando el número de sumandos a la precisión
> > requerida. Por ejemplo:
> >
> >>>> from mpmath import *
> >>>> tan(1.5707963267948966)
> > mpf('16331239353195370.0')
> >>>> tan(pi/2)
> > mpf('16331239353195370.0')
> >
> > Aumentamos la precisión
> >
> >>>> mp.dps = 50
> >>>> tan(1.5707963267948966)
> > mpf('16331239353195369.755967737041528916530864068104910291')
> >>>> tan(pi/2)
> > mpf('-1978834901269570871682051952580899049722178117311132.0')
> >>>> tan(mpf('1.5707963267948966192313216916397514420985846996875534'))
> > mpf('-1978834901269570871682051952580899049722178117311132.0')
> >
> >
> >> ¿Algún modo de ajustar más el resultado a
> >> infinito (sin ser la solución trivial de comprobar los parámetros
> >> de entrada)?
> >
> > Creo que la única opción es usar un módulo matemático de precisión
> > arbitraria como mpmath o bigfloat.
> 
> 
> Por lo que parece, la tendencia a infinito está en relación con la
> precisión del cálculo. Cuanto más digitos de precisión, tanto más
> grande será el número
> 
> Comprobando con mpmath:
> 
> dps    resultado aprox.
> ------ | -----------------------
> 10      390115388672.0
> 15      1.63312393531954e+16
> 50     -1.97883490126957e+51
> 100     6.97133053829442e+101
> 300     1.59802604184178e+301
> 1000    2.84594257232622e+1001
> 5000   -1.04829403956079e+5001
> 10000  -7.59194855601038e+10001
> 12000   8.19055339712727e+12001
> 15000   1.18530955294349e+15001
> 20000   1.34274677646898e+20001
> 30000  -1.14011942791359e+30001
> 
> El que alternen los signos supongo que será cosa del algorítmo de
> aproximación.

Posiblemente sea debido a que según el redondeo de la última cifra
significativa para la aproximación de pi/2 en unos casos el valor
numérico esté a la derecha de pi/2 y en otros a la izquierda. 


> 
> 
> --
> Hyperreals *R: http://ch3m4.org/blog
> Quarks, bits y otras criaturas infinitesimales
> _______________________________________________
> Python-es mailing list
> [email protected]
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
_______________________________________________
Python-es mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a