Python中二次公式与多线程实现的错误排查及修复方案
二次公式多线程代码错误修复
1. TypeError: 'int'/'float'对象不可调用
- 原因:创建
Thread对象时,target参数传的是函数调用结果(比如Quad_pt1()),不是函数本身。函数执行后返回int/float类型值,线程启动时会尝试调用这个值,直接触发类型错误。另外原代码里的exit()会直接终止程序,后面的计算代码根本跑不起来;而且函数内部的Pt1/Pt2/Pt3是局部变量,外部根本访问不到。 - 修复:
- 创建线程时,
target只传函数名(不带括号),比如threading.Thread(target=Quad_pt1) - 用全局列表或者
threading.Queue来存线程的计算结果,方便后续获取 - 删掉多余的
exit()语句
- 创建线程时,
2. math domain error(判别式为负时)
- 原因:
math.sqrt()只能处理非负实数,当判别式b²-4ac为负数时,就会抛出定义域错误。 - 修复:
- 改用
cmath.sqrt(),它支持复数运算,就算判别式为负,也能算出复数根 - 也可以在计算前先判断判别式的正负,给用户提示后再决定是否计算复数根
- 改用
3. 大整数输入无法转换为float
- 原因:超大整数转float会丢失精度(float的有效位数有限),导致计算结果不准。
- 修复:
- 如果判别式是非负整数,用
math.isqrt()(Python3.8及以上版本)计算平方根,保持整数运算的精度 - 要是需要支持复数,直接用
cmath模块,它能处理大整数的复数运算
- 如果判别式是非负整数,用
修复后的完整代码
import math import cmath import threading # 用全局列表存储各线程的计算结果 results = [None, None, None] A = input("What is your a? ") B = input("What is your B? ") C = input("What is your C? ") # 增加输入转换的异常处理,避免非整数输入报错 try: a = int(A) b = int(B) c = int(C) except ValueError: print("请输入有效的整数!") exit() def Quad_pt1(): results[0] = -b def Quad_pt2(): discriminant = b**2 - 4*a*c # 根据判别式类型选择对应的平方根计算方式 if discriminant >= 0: # 整数判别式用isqrt保证精度,非整数用math.sqrt results[1] = math.isqrt(discriminant) if isinstance(discriminant, int) else math.sqrt(discriminant) else: # 负判别式用cmath计算复数平方根 results[1] = cmath.sqrt(discriminant) def Quad_pt3(): results[2] = 2*a # 创建线程时传入函数名,而非函数调用 t1 = threading.Thread(target=Quad_pt1) t2 = threading.Thread(target=Quad_pt2) t3 = threading.Thread(target=Quad_pt3) t1.start() t2.start() t3.start() t1.join() t2.join() t3.join() # 提取结果并计算二次方程的根 pt1, pt2, pt3 = results if pt3 == 0: print("a不能为0,这不是二次方程!") else: root1 = (pt1 + pt2) / pt3 root2 = (pt1 - pt2) / pt3 print(f"第一个根: {root1}") print(f"第二个根: {root2}")
内容的提问来源于stack exchange,提问作者Sterling Russell
相关产品推荐
相关产品推荐

