Note: There is now math.isqrt in stdlib, available since Python 3.8.

Newton's method works perfectly well on integers:

def isqrt(n):
    x = n
    y = (x + 1) // 2
    while y < x:
        x = y
        y = (x + n // x) // 2
    return x

This returns the largest integer x for which x * x does not exceed n. If you want to check if the result is exactly the square root, simply perform the multiplication to check if n is a perfect square.

I discuss this algorithm, and three other algorithms for calculating square roots, at my blog.

Answer from user448810 on Stack Overflow
Top answer
1 of 14
114

Note: There is now math.isqrt in stdlib, available since Python 3.8.

Newton's method works perfectly well on integers:

def isqrt(n):
    x = n
    y = (x + 1) // 2
    while y < x:
        x = y
        y = (x + n // x) // 2
    return x

This returns the largest integer x for which x * x does not exceed n. If you want to check if the result is exactly the square root, simply perform the multiplication to check if n is a perfect square.

I discuss this algorithm, and three other algorithms for calculating square roots, at my blog.

2 of 14
48

Update: Python 3.8 has a math.isqrt function in the standard library!

I benchmarked every (correct) function here on both small (0…222) and large (250001) inputs. The clear winners in both cases are gmpy2.isqrt suggested by mathmandan in first place, followed by Python 3.8’s math.isqrt in second, followed by the ActiveState recipe linked by NPE in third. The ActiveState recipe has a bunch of divisions that can be replaced by shifts, which makes it a bit faster (but still behind the native functions):

def isqrt(n):
    if n > 0:
        x = 1 << (n.bit_length() + 1 >> 1)
        while True:
            y = (x + n // x) >> 1
            if y >= x:
                return x
            x = y
    elif n == 0:
        return 0
    else:
        raise ValueError("square root not defined for negative numbers")

Benchmark results:

  • gmpy2.isqrt() (mathmandan): 0.08 µs small, 0.07 ms large
  • int(gmpy2.isqrt())*: 0.3 µs small, 0.07 ms large
  • Python 3.8 math.isqrt: 0.13 µs small, 0.9 ms large
  • ActiveState (optimized as above): 0.6 µs small, 17.0 ms large
  • ActiveState (NPE): 1.0 µs small, 17.3 ms large
  • castlebravo long-hand: 4 µs small, 80 ms large
  • mathmandan improved: 2.7 µs small, 120 ms large
  • martineau (with this correction): 2.3 µs small, 140 ms large
  • nibot: 8 µs small, 1000 ms large
  • mathmandan: 1.8 µs small, 2200 ms large
  • castlebravo Newton’s method: 1.5 µs small, 19000 ms large
  • user448810: 1.4 µs small, 20000 ms large

(* Since gmpy2.isqrt returns a gmpy2.mpz object, which behaves mostly but not exactly like an int, you may need to convert it back to an int for some uses.)

🌐
Real Python
realpython.com › python-square-root-function
The Python Square Root Function – Real Python
November 3, 2024 - The square root, then, is the number n, which when multiplied by itself yields the square, x. In this example, n, the square root of 25, is 5. 25 is an example of a perfect square.
🌐
W3Schools
w3schools.com › python › ref_math_isqrt.asp
Python math.isqrt() Method
Python Examples Python Compiler Python Exercises Python Quiz Python Challenges Python Server Python Syllabus Python Study Plan Python Interview Q&A Python Bootcamp Python Certificate Python Training ... # Import math Library import math # Print the square root of different numbers print (math.sqrt(10)) print (math.sqrt (12)) print (math.sqrt (68)) print (math.sqrt (100)) # Round square root downward to the nearest integer print (math.isqrt(10)) print (math.isqrt (12)) print (math.isqrt (68)) print (math.isqrt (100)) Run Example »
🌐
GeeksforGeeks
geeksforgeeks.org › python-math-isqrt-method
Python | math.isqrt() method | GeeksforGeeks
April 28, 2025 - Math module in Python contains a number of mathematical operations, which can be performed with ease using the module. math.isqrt() method in Python is used to get the integer square root of the given non-negative integer value n.
🌐
PyPI
pypi.org › project › isqrt
isqrt · PyPI
Given an arbitrarily large non-negative integer n, the integer square root function finds the largest integer r such that r**2 <= n and (r + 1)**2 > n. The built-in math.isqrt function was introduced in Python 3.8 and should normally be used ...
      » pip install isqrt
    
Published   May 25, 2023
Version   1.1.0
🌐
Reddit
reddit.com › r/programminghorror › computing integer square roots in python
r/programminghorror on Reddit: Computing integer square roots in python
March 8, 2024 - So the square root of any number is SyntaxError... I didn't know that ... I mean you can, but its complicated. ... How about no? (-n) * (-n) = n * n There, squared. ... The code is designed to raise a SyntaxWarning on python >= 3.11.
🌐
Python
docs.python.org › 3 › library › math.html
math — Mathematical functions
Use ** or the built-in pow() function for computing exact integer powers. Changed in version 3.11: The special cases pow(0.0, -inf) and pow(-0.0, -inf) were changed to return inf instead of raising ValueError, for consistency with IEEE 754.
🌐
TradingCode
tradingcode.net › python › math › square-root
How to calculate the square root in Python? • TradingCode
So, in other words, 3 squared is 9, and so the square root of 9 is 3. See square values in Python for more. Another way to calculate the square root is with the math.isqrt() function. This function always returns the integer square root (Python ...
Find elsewhere
🌐
LeetCode
leetcode.com › problems › sqrtx
Sqrt(x) - LeetCode
* For example, do not use pow(x, 0.5) in c++ or x ** 0.5 in python. Example 1: Input: x = 4 Output: 2 Explanation: The square root of 4 is 2, so we return 2. Example 2: Input: x = 8 Output: 2 Explanation: The square root of 8 is 2.82842..., ...
🌐
GitHub
github.com › lapets › isqrt
GitHub - lapets/isqrt: Efficient pure-Python implementation of the integer square root function.
Given an arbitrarily large non-negative integer n, the integer square root function finds the largest integer r such that r**2 <= n and (r + 1)**2 > n. The built-in math.isqrt function was introduced in Python 3.8 and should normally be used ...
Author   lapets
🌐
datagy
datagy.io › home › python posts › python square root: how to calculate a square root in python
Python Square Root: How to Calculate a Square Root in Python • datagy
December 20, 2022 - The reason for this is that the isqrt() floors the value to its nearest integer. In this post, you learned how to use Python to calculate a square root, both with and without the math.sqrt() function.
🌐
W3Schools
w3schools.com › python › ref_math_sqrt.asp
Python math.sqrt() Method
Python Examples Python Compiler Python Exercises Python Quiz Python Challenges Python Server Python Syllabus Python Study Plan Python Interview Q&A Python Bootcamp Python Certificate Python Training ... # Import math Library import math # Return the square root of different numbers print (math.sqrt(9)) print (math.sqrt(25)) print (math.sqrt(16)) Try it Yourself »
🌐
GeeksforGeeks
geeksforgeeks.org › python › python-program-to-find-square-root-of-given-number
Find Square Root Of Given Number - Python - GeeksforGeeks
July 23, 2025 - Explanation: x**0.5 calculates the square root of x, and int(sqrt) converts it to the largest integer less than or equal to the sqrt.
🌐
Python
bugs.python.org › issue36887
Issue 36887: Add integer square root, math.isqrt - Python tracker
This issue tracker has been migrated to GitHub, and is currently read-only. For more information, see the GitHub FAQs in the Python's Developer Guide · This issue has been migrated to GitHub: https://github.com/python/cpython/issues/81068
Top answer
1 of 11
107

Option 1: math.sqrt()

The math module from the standard library has a sqrt function to calculate the square root of a number. It takes any type that can be converted to float (which includes int) and returns a float.

>>> import math
>>> math.sqrt(9)
3.0

Option 2: Fractional exponent

The power operator (**) or the built-in pow() function can also be used to calculate a square root. Mathematically speaking, the square root of a equals a to the power of 1/2.

The power operator requires numeric types and matches the conversion rules for binary arithmetic operators, so in this case it will return either a float or a complex number.

>>> 9 ** (1/2)
3.0
>>> 9 ** .5  # Same thing
3.0
>>> 2 ** .5
1.4142135623730951

(Note: in Python 2, 1/2 is truncated to 0, so you have to force floating point arithmetic with 1.0/2 or similar. See Why does Python give the "wrong" answer for square root?)

This method can be generalized to nth root, though fractions that can't be exactly represented as a float (like 1/3 or any denominator that's not a power of 2) may cause some inaccuracy:

>>> 8 ** (1/3)
2.0
>>> 125 ** (1/3)
4.999999999999999

Edge cases

Negative and complex

Exponentiation works with negative numbers and complex numbers, though the results have some slight inaccuracy:

>>> (-25) ** .5  # Should be 5j
(3.061616997868383e-16+5j)
>>> 8j ** .5  # Should be 2+2j
(2.0000000000000004+2j)

(Note: the parentheses are required on -25, otherwise it's parsed as -(25**.5) because exponentiation is more tightly binding than negation.)

Meanwhile, math is only built for floats, so for x<0, math.sqrt(x) will raise ValueError: math domain error and for complex x, it'll raise TypeError: can't convert complex to float. Instead, you can use cmath.sqrt(x), which is more accurate than exponentiation (and will likely be faster too):

>>> import cmath
>>> cmath.sqrt(-25)
5j
>>> cmath.sqrt(8j)
(2+2j)

Precision

Both options involve an implicit conversion to float, so floating point precision is a factor. For example let's try a big number:

>>> n = 10**30
>>> x = n**2
>>> root = x**.5
>>> root == n
False
>>> root - n  # how far off are they?
0.0
>>> int(root) - n  # how far off is the float from the int?
19884624838656

Very large numbers might not even fit in a float and you'll get OverflowError: int too large to convert to float. See Python sqrt limit for very large numbers?

Other types

Let's look at Decimal for example:

Exponentiation fails unless the exponent is also Decimal:

>>> decimal.Decimal('9') ** .5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for ** or pow(): 'decimal.Decimal' and 'float'
>>> decimal.Decimal('9') ** decimal.Decimal('.5')
Decimal('3.000000000000000000000000000')

Meanwhile, math and cmath will silently convert their arguments to float and complex respectively, which could mean loss of precision.

decimal also has its own .sqrt(). See also calculating n-th roots using Python 3's decimal module

2 of 11
25

SymPy

Depending on your goal, it might be a good idea to delay the calculation of square roots for as long as possible. SymPy might help.

SymPy is a Python library for symbolic mathematics.

import sympy
sympy.sqrt(2)
# => sqrt(2)

This doesn't seem very useful at first.

But sympy can give more information than floats or Decimals:

sympy.sqrt(8) / sympy.sqrt(27)
# => 2*sqrt(6)/9

Also, no precision is lost. (√2)² is still an integer:

s = sympy.sqrt(2)
s**2
# => 2
type(s**2)
#=> <class 'sympy.core.numbers.Integer'>

In comparison, floats and Decimals would return a number which is very close to 2 but not equal to 2:

(2**0.5)**2
# => 2.0000000000000004

from decimal import Decimal
(Decimal('2')**Decimal('0.5'))**Decimal('2')
# => Decimal('1.999999999999999999999999999')

Sympy also understands more complex examples like the Gaussian integral:

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)
# => True

Finally, if a decimal representation is desired, it's possible to ask for more digits than will ever be needed:

sympy.N(sympy.sqrt(2), 1_000_000)
# => 1.4142135623730950488016...........2044193016904841204
🌐
Programiz
programiz.com › python-programming › examples › square-root
Python Program to Find the Square Root
# Find square root of real or complex ... is {1:0.3f}+{2:0.3f}j'.format(num ,num_sqrt.real,num_sqrt.imag)) ... In this program, we use the sqrt() function in the cmath (complex math) module....
🌐
Analytics Vidhya
analyticsvidhya.com › home › python square root
Python Square Root
October 10, 2024 - In Python, the exponentiation operator (**) can be used to calculate square roots by raising a number to the power of 1/2 (0.5). This method works for both integers and floats. If the number is positive, it returns a float.