如果所有整数都是正数,为什么第 30 行不起作用?

问题描述 投票:0回答:1

这是我的代码

import math
print("\nFor reference, here is the Quadratic Formula: x = (-b±√(b²-4ac)) / (2a)\n\n")

while True:
    try:
        a = int(input("\nWhat is your value for a? >>> "))
    except ValueError:
        print("That is not a valid number, Please ender a valid number")
    if a == 0:
      print("a can NOT be equal to 0, Please enter a valid number")
    else: break

while True:
    try:
        b = int(input("\nWhat is your value for b? >>> "))
        break
    except ValueError:
        print("That was not a valid number. Please enter a valid number")

while True:
    try:
        c = int(input("\nWhat is your value for c? >>> "))
        break
    except ValueError:
        print("That was not a valid number. Please enter a valid number")
        
exp = 2

underRoot = math.pow(b, exp) - (4 * a * c)

root = math.sqrt(underRoot)

posNumber = -b + root
negNumber = -b - root

denom = 2 * a

x_1 = posNumber / denom
x_2 = negNumber / denom

output = f"\n\nthe values of x-intercepts are {x_1} and {x_2}"
print(output)

我正在测试我的代码,当我为每个整数输入所有正数时,第 30 行给出了一个错误,提示“ValueError:数学域错误”。有谁知道如何防止这种情况吗?

python math quadratic
1个回答
0
投票

错误来自于尝试取负数的平方根。如果

underRoot
大于
4*a*c
,则不保证
b^2
为正。当你的方程没有实数解时就会出现这种情况,例如
x^2 + 1 = 0
(测试一下,那里有错误)。有两种方法可以解决这个问题。

  1. 使用简单的 if 语句检查 underRoot 是否为负数,只有在为正数时才执行计算。
if underRoot < 0:
  print ("No real solutions")
else:
  root = math.sqrt(underRoot)
  [...]
  1. 使用 CMath 模块允许复杂的编号结果。警告 - 这会让你的输出有点难看。
root = cmath.sqrt(underRoot)
[...]
© www.soinside.com 2019 - 2024. All rights reserved.