Python3 平方根
一、方法 1:math.sqrt() - 常用非负数值平方根(推荐)
math模块是 Python3 内置的标准数学库,其sqrt()函数是计算非负数值平方根的首选方案,具有执行效率高、结果精度高的特点,专门针对实数(浮点数 / 整数)的平方根计算做了优化。核心特性
- 适用类型:非负整数(
int)、非负浮点数(float) - 返回类型:浮点数(
float) - 异常情况:传入负数时会抛出
ValueError异常(不支持复数计算) - 使用前提:需导入
math模块
代码实例
# 导入math模块
import math
# 1. 计算整数的平方根
int_num = 16
int_sqrt = math.sqrt(int_num)
print(f"整数 {int_num} 的平方根:{int_sqrt}")
print(f"结果类型:{type(int_sqrt)}")
# 2. 计算浮点数的平方根
float_num = 2.25
float_sqrt = math.sqrt(float_num)
print(f"浮点数 {float_num} 的平方根:{float_sqrt}")
# 3. 计算无理数平方根(保留高精度小数)
irrational_num = 10
irrational_sqrt = math.sqrt(irrational_num)
print(f"无理数 {irrational_num} 的平方根(高精度):{irrational_sqrt}")
# 注意:传入负数会报错,以下代码注释解除后会抛出ValueError
# negative_num = -9
# negative_sqrt = math.sqrt(negative_num)
运行结果
整数 16 的平方根:4.0
结果类型:<class 'float'>
浮点数 2.25 的平方根:1.5
无理数 10 的平方根(高精度):3.1622776601683795
二、方法 2:指数运算 ** 0.5 / ** (1/2) - 无依赖灵活计算
Python 的指数运算符
**可直接实现平方根计算,无需导入任何模块,是最灵活的极简方案。其本质是通过幂运算推导(平方根即数值的 1/2 次幂),支持更广泛的数值类型。核心特性
- 适用类型:非负整数、非负浮点数、负数(返回复数类型)
- 返回类型:非负数返回浮点数,负数返回复数(
complex) - 优势:无需导入模块,代码简洁,支持复数平方根计算
- 注意:
1/2在 Python3 中默认返回浮点数,与0.5效果一致;整数作底数时,结果仍为浮点数
代码实例
# 1. 非负整数平方根(无模块导入)
num1 = 25
sqrt1 = num1 ** 0.5
print(f"整数 {num1} 的平方根(** 0.5):{sqrt1}")
# 2. 非负浮点数平方根
num2 = 4.9
sqrt2 = num2 ** (1/2)
print(f"浮点数 {num2} 的平方根(** (1/2)):{sqrt2}")
# 3. 负数平方根(自动返回复数)
num3 = -16
sqrt3 = num3 ** 0.5
print(f"负数 {num3} 的平方根:{sqrt3}")
print(f"负数平方根结果类型:{type(sqrt3)}")
运行结果
整数 25 的平方根(** 0.5):5.0
浮点数 4.9 的平方根(** (1/2)):2.2135943621178655
负数 -16 的平方根:(0+4j)
负数平方根结果类型:<class 'complex'>
三、方法 3:math.isqrt() - 整数专属整数平方根(Python3.8 + 新增)
math.isqrt()是 Python3.8 版本新增的专属函数,专门用于计算非负整数的整数平方根(向下取整,即舍去小数部分,返回最大的不大于真实平方根的整数),适用于只需整数结果的场景。核心特性
- 适用类型:非负整数(
int),传入浮点数或负数会报错 - 返回类型:整数(
int) - 核心逻辑:向下取整,例如
math.isqrt(10)返回3(真实平方根≈3.16,向下取整为 3) - 优势:相比
math.sqrt()再强制类型转换,效率更高,结果直接为整数,无需额外处理
代码实例
import math
# 1. 完全平方数的整数平方根(结果为精确整数)
num1 = 36
isqrt1 = math.isqrt(num1)
print(f"整数 {num1} 的整数平方根:{isqrt1}")
print(f"结果类型:{type(isqrt1)}")
# 2. 非完全平方数的整数平方根(向下取整)
num2 = 10
isqrt2 = math.isqrt(num2)
print(f"整数 {num2} 的整数平方根(向下取整):{isqrt2}")
# 3. 大数整数平方根(仍高效返回整数结果)
num3 = 123456789
isqrt3 = math.isqrt(num3)
print(f"大数 {num3} 的整数平方根:{isqrt3}")
# 注意:传入浮点数/负数会报错,以下代码注释解除后会抛出异常
# num4 = 17.5
# isqrt4 = math.isqrt(num4)
# num5 = -25
# isqrt5 = math.isqrt(num5)
运行结果
整数 36 的整数平方根:6
结果类型:<class 'int'>
整数 10 的整数平方根(向下取整):3
大数 123456789 的整数平方根:11111
四、方法 4:cmath.sqrt() - 复数专属高精度平方根
cmath模块是 Python 的复数数学库,其sqrt()函数专门用于处理复数的平方根计算,也可处理实数(非负数返回浮点数形式复数,负数返回纯虚数),适用于高精度复数运算场景。核心特性
- 适用类型:所有整数、浮点数(实数)、复数
- 返回类型:复数(
complex,即使非负数结果也会以复数形式返回,如4.0+0j) - 优势:高精度复数运算,专门适配复数场景,无异常抛出
- 使用前提:需导入
cmath模块
代码实例
# 导入cmath模块
import cmath
# 1. 非负实数的平方根(返回复数类型)
num1 = 81
sqrt1 = cmath.sqrt(num1)
print(f"非负整数 {num1} 的平方根(cmath):{sqrt1}")
# 2. 负数的平方根(返回纯虚数)
num2 = -25
sqrt2 = cmath.sqrt(num2)
print(f"负数 {num2} 的平方根(cmath):{sqrt2}")
# 3. 复数的平方根(直接处理复数底数)
num3 = 3 + 4j
sqrt3 = cmath.sqrt(num3)
print(f"复数 {num3} 的平方根:{sqrt3}")
运行结果
非负整数 81 的平方根(cmath):(9+0j)
负数 -25 的平方根(cmath):5j
复数 (3+4j) 的平方根:(2+1j)
五、核心方法对比表
为方便你快速选择最优方案,整理了 4 种方法的关键特性对比:
| 方法 | 适用类型 | 返回类型 | 核心优势 | 适用场景 | Python 版本要求 |
|---|---|---|---|---|---|
math.sqrt() |
非负 int/float | float | 精度高、效率高 | 普通实数平方根计算(需高精度浮点数) | 所有 Python3 版本 |
** 0.5/** (1/2) |
所有 int/float(含负数) | 非负:float;负数:complex | 无模块依赖、代码简洁、支持复数 | 快速计算、无需导入模块、负数平方根 | 所有 Python3 版本 |
math.isqrt() |
非负 int | int | 整数结果、向下取整、效率高 | 只需整数平方根的场景(如计数、判断) | Python3.8+ |
cmath.sqrt() |
所有 int/float/ 复数 | complex | 高精度复数运算、无异常 | 复数场景的平方根计算 | 所有 Python3 版本 |
六、常见问题与注意事项
- 避免负数传入
math.sqrt():该函数不支持负数,传入后会抛出ValueError: math domain error,需提前做非负判断或改用** 0.5/cmath.sqrt()。 math.isqrt()的版本兼容:若你的 Python 版本低于 3.8,使用该函数会报错,可改用int(math.sqrt(x))(效果一致,但效率略低)。- 精度差异:
math.sqrt()比指数运算** 0.5的精度略高,对高精度要求的科学计算,优先选择math.sqrt()。 - 复数识别:
** 0.5处理负数时自动返回复数,若无需复数类型,需先过滤负数。
浙公网安备 33010602011771号