【问题标题】:python - returns incorrect positive #python - 返回不正确的正数#
【发布时间】:2011-06-09 17:44:21
【问题描述】:

我想做的是写一个二次方程求解器,但是当解应该是-1,就像quadratic(2, 4, 2)一样,它返回1

我做错了什么?

#!/usr/bin/python 导入数学 def 二次(a,b,c): #a = raw_input("你的 `a` 值是多少?\t") #b = raw_input("你的 `b` 值是多少?\t") #c = raw_input("你的 `c` 值是多少?\t") a, b, c = 浮点数(a), 浮点数(b), 浮点数(c) 圆盘 = (b*b)-(4*a*c) print "判别式是:\n" + str(disc) 如果光盘 >= 0: 根 = math.sqrt(光盘) top1 = b + 根 top2 = b - 根 sol1 = top1/(2*a) sol2 = top2/(2*a) 如果 sol1 != sol2: 打印 "解决方案 1:\n" + str(sol1) + "\n解决方案 2:\n" + str(sol2) 如果 sol1 == sol2: print "一个解决方案:\n" + str(sol1) 别的: 打印“没有解决方案!”

编辑:它返回以下...

>>> 导入数学模块 >>> mathmodules.quadratic(2, 4, 2) 判别式是: 0.0 一种解决方案: 1.0

【问题讨论】:

    标签: python math module quadratic function


    【解决方案1】:

    除非自从我上学后公式发生了变化(永远无法确定),否则它是(-b +- sqrt(b^2-4ac)) / 2a,你的代码中有b

    [edit] 我可以建议重构吗?

    def quadratic(a, b, c):
        discriminant = b**2 - 4*a*c
        if discriminant < 0:
          return []
        elif discriminant == 0:
          return [-b / (2*a)]
        else:
          root = math.sqrt(discriminant)
          return [(-b + root) / (2*a), (-b - root) / (2*a)]
    
    print quadratic(2, 3, 2) # []
    print quadratic(2, 4, 2) # [-1]                    
    print quadratic(2, 5, 2) # [-0.5, -2.0]
    

    【讨论】:

    • 如果将第 3 行更改为:return [complex(-b, math.sqrt(-discriminant))/(2*a), \ complex(-b, - math.sqrt(-discriminant))/(2*a)]
    • +1 - 干得好,tokland,但它本来可以为负判别情况返回复共轭根,因为 Python 非常支持复数。等于零的判别式有两个根——其中一个是零。我会推荐这两个更改
    • @bvmou,@duffymo。确实,但我试图模仿原始代码,它不考虑复数。但是,是的,您可以按照您的描述添加它们。 @duffymo:我不明白判别式 = 0 意味着 0 是一个根,而是两个相等的根(-b/2a)。我打算这样做(不要费心检查 disc=0),但同样,原始代码将其视为单一解决方案。
    【解决方案2】:

    二次方程的解是

    x = (-b +/- sqrt(b^2 - 4ac))/2a
    

    但是你编码的是

    x = (b +/- sqrt(b^2 - 4ac))/2a
    

    这就是为什么你会收到签名错误。

    【讨论】:

      【解决方案3】:
      top1 = b + root
      top2 = b - root
      

      应该是:

      top1 = -b + root
      top2 = -b - root
      

      【讨论】:

        【解决方案4】:

        top1top2的符号不对,见http://en.wikipedia.org/wiki/Quadratic_equation

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-22
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 2019-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多