Necesito calcular la raíz cuadrada de algunos números, por ejemplo √9 = 3 y √2 = 1.4142 . ¿Cómo puedo hacerlo en Python?
Las entradas probablemente serán todos números enteros positivos y relativamente pequeños (digamos menos de mil millones), pero en caso de que no lo sean, ¿hay algo que pueda romperse?
Relacionados
Nota : Este es un intento de una pregunta canónica después de una discusión en Meta sobre una pregunta existente con el mismo título .
Dependiendo de tu objetivo, podría ser una buena idea retrasar el cálculo de las raíces cuadradas tanto como sea posible. SymPy podría ayudar.
SymPy es una biblioteca de Python para matemáticas simbólicas.
import sympy sympy.sqrt(2) # => sqrt(2)Esto no parece muy útil al principio.
Pero sympy puede dar más información que flotantes o decimales:
sympy.sqrt(8) / sympy.sqrt(27) # => 2*sqrt(6)/9Además, no se pierde precisión. (√2)² sigue siendo un número entero:
s = sympy.sqrt(2) s**2 # => 2 type(s**2) #=> <class 'sympy.core.numbers.Integer'>En comparación, los flotantes y los decimales devolverían un número muy cercano a 2 pero no igual a 2:
(2**0.5)**2 # => 2.0000000000000004 from decimal import Decimal (Decimal('2')**Decimal('0.5'))**Decimal('2') # => Decimal('1.999999999999999999999999999')Sympy también comprende ejemplos más complejos como la integral de Gauss :
from sympy import Symbol, integrate, pi, sqrt, exp, oo x = Symbol('x') integrate(exp(-x**2), (x, -oo, oo)) # => sqrt(pi) integrate(exp(-x**2), (x, -oo, oo)) == sqrt(pi) # => TrueFinalmente, si se desea una representación decimal, es posible solicitar más dígitos de los que se necesitarán:
sympy.N(sympy.sqrt(2), 1_000_000) # => 1.4142135623730950488016...........2044193016904841204 >>> import numpy as np >>> np.sqrt(25) 5.0 >>> np.sqrt([2, 3, 4]) array([1.41421356, 1.73205081, 2. ]) Para reales negativos, devolverá nan , por lo que np.lib.scimath.sqrt() está disponible para ese caso.
>>> a = np.array([4, -1, np.inf]) >>> np.sqrt(a) <stdin>:1: RuntimeWarning: invalid value encountered in sqrt array([ 2., nan, inf]) >>> np.lib.scimath.sqrt(a) array([ 2.+0.j, 0.+1.j, inf+0.j])Otra opción, por supuesto, es convertir primero a complejo:
>>> a = a.astype(complex) >>> np.sqrt(a) array([ 2.+0.j, 0.+1.j, inf+0.j])