0

二次式を使用して二次方程式を解くプログラムを作成していますが、a = 1 の場合にのみ機能しますが、a が 1 より大きい場合に機能させたい

これが私のコードです:

import math

def solve(a, b, c):

    x = ((-1)* b + math.sqrt(b**2-4*a*c))/2*a
    print "x = %s" %x
    print "or"
    y = ((-1)* b - math.sqrt(b**2-4*a*c))/2*a
    print "x = %s" %x




while 1:
    a = int(raw_input("Enter A :"))
    b = int(raw_input("Enter B :"))
    c = int(raw_input("Enter C :")) 
    solve(a, b, c)

1で動作しますが、4を使用するときに複数の数値を使用すると、このエラーが発生します

Traceback (most recent call last):
  File "C:\Documents and Settings\User\Desktop\Factor.py", line 18, in <module>
    solve(a, b, c)
  File "C:\Documents and Settings\User\Desktop\Factor.py", line 5, in solve
    x = ((-1)* b + math.sqrt(b**2-4*a*c))/2*a
ValueError: math domain error

もしそうなら、これを回避する方法はありますか?

4

5 に答える 5

6

問題は次のとおりです。

  1. 演算子の優先順位:正しく動作する/2*a必要があります。/(2*a)
  2. sqrt:の定義域はmath.sqrt負の数に依存します。
  3. 編集2: y = ...直後にprint "or"あるはずですx = ...

後者を修正するには、何らかの条件が必要です。

disc = b**2 - 4*a*c
sqrtdisc = math.sqrt(disc) if disc >= 0 else math.sqrt(-disc)*1j

編集:cmath.sqrt負の数を自動的に処理する を使用することもできます:

disc = b**2 - 4*a*c
sqrtdisc = cmath.sqrt(disc)

(それが存在することを効果的に知らせてくれた他のさまざまな回答者に感謝しcmathます。)

于 2013-05-02T06:37:54.017 に答える
5

複素数を処理するには、代わりに cmath を使用します。

import cmath
cmath.sqrt(negativenumber)
于 2013-05-02T06:41:17.983 に答える
5

取得している理由ValueErrorは、式b**2-4*a*cが負の値を返しているためです。これは許可されていませんmath.sqrt

>>> math.sqrt(-1)
Traceback (most recent call last):
  File "<ipython-input-38-5234f21f3b4d>", line 1, in <module>
    math.sqrt(-1)
ValueError: math domain error

cmath.sqrt負の値も処理するために使用します。

>>> import cmath
>>> cmath.sqrt(-1)
1j
于 2013-05-02T06:37:18.097 に答える
3

math domain errorに負の値を与えているため、 を取得していますmath.sqrt。これは、正の値を与えるのに十分なだけa増加していないため、増加するにつれて発生する可能性があります。bb**2-4*a*c

于 2013-05-02T06:37:00.387 に答える
0

ルートを取得するには、次のようなものを使用してみてください。

def roots(a, b, c):

    def getDiscriminant(a, b, c,Error = "Imaginary Roots"):
        try:
            return (b ** 2 - (4 * a * c)) ** .5
        except:
            return Error

    D = getDiscriminant(a, b, c) 

    if D == False:
        return False

    b = -b
    a = 2 * a

    firstroot = float((b + D) / float(a))
    secondroot = float((b - D) / float(a))

    return (firstroot,secondroot)
于 2013-05-12T20:35:39.323 に答える