Raíz cuadrada en Python: math.sqrt, ** 0.5 y cuál usar

En este artículo
  1. Las cuatro formas
  2. Cuál usar
  3. Los dos errores más frecuentes
  4. La precisión decimal
  5. Ejemplos aplicados
  6. Preguntas frecuentes

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ónUsa
Caso generalmath.sqrt()
Expresión corta, sin importar módulos** 0.5
Otras raíces (cúbica, cuarta…)** (1/n)
El número puede ser negativocmath.sqrt()
Solo necesitas la parte enteramath.isqrt()
Arrays o listas grandes de númerosnumpy.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.