Raíz cuadrada en Python: math.sqrt, ** 0.5 y cuál usar
En este artículo
En Python hay cuatro formas de calcular una raíz cuadrada, y cada una sirve para un caso distinto. La más habitual:
import math
resultado = math.sqrt(25)
print(resultado) # 5.0
Abajo tienes las cuatro, cuándo usar cada una y los dos errores que provocan casi todas las consultas sobre este tema.
Las cuatro formas
1. math.sqrt() — la estándar
import math
math.sqrt(16) # 4.0
math.sqrt(2) # 1.4142135623730951
math.sqrt(0) # 0.0
Devuelve siempre un float, incluso con resultados exactos: math.sqrt(16) da 4.0 y no 4. Si necesitas un entero, conviértelo con int().
Ventaja: es la más rápida y la más legible. Al leer math.sqrt(x) queda claro qué hace.
2. El operador ** 0.5
16 ** 0.5 # 4.0
2 ** 0.5 # 1.4142135623730951
Elevar a 0,5 equivale matemáticamente a la raíz cuadrada. No necesita importar nada.
Cuándo usarlo: en expresiones cortas o cuando quieras otra raíz. Para la raíz cúbica: 27 ** (1/3).
Ojo con la precedencia: el operador ** tiene más prioridad que el menos unario, así que -4 ** 0.5 no es lo que parece. Se interpreta como -(4 ** 0.5) y devuelve -2.0. Usa paréntesis.
3. cmath.sqrt() — para números negativos
import cmath
cmath.sqrt(-9) # 3j
cmath.sqrt(-2) # 1.4142135623730951j
Trabaja con números complejos, así que acepta negativos sin error. Solo lo necesitas si tu problema admite soluciones complejas.
4. math.isqrt() — raíz entera
import math
math.isqrt(17) # 4 (la parte entera de 4.123...)
math.isqrt(25) # 5
Devuelve la parte entera de la raíz, sin decimales y sin errores de redondeo. Disponible desde Python 3.8.
Para qué sirve: algoritmos con enteros grandes, comprobar si un número es cuadrado perfecto, o buscar divisores. Es exacta incluso con números enormes, donde math.sqrt() pierde precisión.
Cuál usar
| Situación | Usa |
|---|---|
| Caso general | math.sqrt() |
| Expresión corta, sin importar módulos | ** 0.5 |
| Otras raíces (cúbica, cuarta…) | ** (1/n) |
| El número puede ser negativo | cmath.sqrt() |
| Solo necesitas la parte entera | math.isqrt() |
| Arrays o listas grandes de números | numpy.sqrt() |
Los dos errores más frecuentes
1. ValueError: math domain error
math.sqrt(-4)
# ValueError: math domain error
El mensaje despista, pero significa algo simple: math.sqrt() no acepta números negativos, porque en los números reales no existe la raíz de un negativo.
Tres soluciones según lo que necesites:
# Opción A: comprobar antes
if numero >= 0:
resultado = math.sqrt(numero)
else:
print("No existe raíz real de un número negativo")
# Opción B: capturar el error
try:
resultado = math.sqrt(numero)
except ValueError:
resultado = None
# Opción C: trabajar con complejos
import cmath
resultado = cmath.sqrt(numero)
2. TypeError con cadenas de texto
numero = input("Dame un número: ")
math.sqrt(numero)
# TypeError: must be real number, not str
input() siempre devuelve texto, aunque escribas un número. Hay que convertirlo:
numero = float(input("Dame un número: "))
print(math.sqrt(numero))
La precisión decimal
Hay un detalle que sorprende al comprobar resultados:
math.sqrt(2) ** 2 # 2.0000000000000004, no 2.0
No es un fallo de Python. Los decimales se almacenan en binario según el estándar de coma flotante, y algunos valores no tienen representación exacta. Ocurre en todos los lenguajes.
Consecuencia práctica: nunca compares resultados con igualdad exacta.
# mal
if math.sqrt(x) == 3.0:
# bien
if math.isclose(math.sqrt(x), 3.0):
Si necesitas precisión decimal exacta, usa el módulo decimal:
from decimal import Decimal, getcontext
getcontext().prec = 30
print(Decimal(2).sqrt())
Ejemplos aplicados
Distancia entre dos puntos
import math
def distancia(x1, y1, x2, y2):
return math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
print(distancia(0, 0, 3, 4)) # 5.0
Python ya lo trae resuelto desde la versión 3.8:
math.dist((0, 0), (3, 4)) # 5.0
Comprobar si un número es cuadrado perfecto
def es_cuadrado_perfecto(n):
if n < 0:
return False
raiz = math.isqrt(n)
return raiz * raiz == n
print(es_cuadrado_perfecto(144)) # True
print(es_cuadrado_perfecto(150)) # False
Aquí isqrt es mejor que sqrt: con números muy grandes, la versión con decimales puede redondear mal y dar un resultado equivocado.
Resolver una ecuación de segundo grado
import math
def resolver(a, b, c):
disc = b**2 - 4*a*c
if disc < 0:
return None
raiz = math.sqrt(disc)
return ((-b + raiz) / (2*a), (-b - raiz) / (2*a))
print(resolver(1, -5, 6)) # (3.0, 2.0)
Con listas grandes: NumPy
import numpy as np
numeros = np.array([4, 9, 16, 25])
print(np.sqrt(numeros)) # [2. 3. 4. 5.]
Para miles de valores es muchísimo más rápido que recorrerlos con un bucle.
Preguntas frecuentes
¿Qué es más rápido, math.sqrt() o ** 0.5?
math.sqrt() suele ser algo más rápido, pero la diferencia solo importa en millones de operaciones. Elige por legibilidad.
¿Cómo calculo la raíz cúbica?
Con n ** (1/3). Para negativos, math.cbrt() desde Python 3.11, o gestiona el signo a mano.
¿Por qué math.sqrt(4) devuelve 4.0 y no 4?
Porque siempre devuelve un float. Conviértelo con int() si necesitas un entero.
¿Necesito instalar algo?
No. math y cmath vienen con Python. Solo NumPy requiere instalación.
¿Aprendiendo Python? En nuestro catálogo de cursos técnicos tienes formación desde cero, con acceso inmediato y de por vida.