Problem z równaniem kwadratowym

0

Cześć, trochę głupie pytanie ale siedzę nad tym z 15 min i nie mogę zrozumieć wyniku, który wyświetla program :P
Chodzi stricte o równanie kwadratowe, tj:

from math import sqrt

a = 4
b = 5
c = 1

delta = b**2 - 4*(a*c)
print('Delta =', delta)

if delta > 0:
    sqrt_delta = sqrt(delta)
    print('Sqrt delta =', sqrt_delta)
    x1 = (-b - sqrt_delta) / 2*a
    x2 = (-b + sqrt_delta) / 2*a
    print(x1)
    print(x2)
elif delta == 0:
    x0 = -b / 2*a
    print(x0)
else:
    print('Równanie kwadratowe nie ma rozwiązań')

Rozwiązaniem równania są pierwiastki x1 = -1, x2 = -0.25. Tymczasem na wyjściu otrzymuję -16 i -4. Pewnie gdzieś jest głupi błąd, ale nie mogę go wyłapać. Będę wdzięczny za pomoc :D

2

Kolejność wykonywania działań:

x1 = (-b - sqrt_delta) / (2*a)

Btw, poczytaj jak działają liczby zmiennoprzecinkowe w komputerze, ponieważ warunek delta == 0 niestety tutaj nie zawsze poda prawidłowe rezultaty ;-)

0

Okej, dzięki. Tak jak myślałem, głupi błąd, ale takie też trzeba zaliczyć podczas nauki :D

0

Dopóki a, b, c nie są zmiennoprzecinkowe, delta nie będzie zmiennoprzecinkowa...

>>> a = 4
>>> b = 5
>>> c = 1
>>> delta = b**2 - 4*(a*c)
>>> delta
9
>>> type(delta)
<class 'int'>
>>>

Ale gdy zdefiniujemy któryś z parametrów jako float (który w Pythonie jest interpretowany jako double!), to wtedy delta nie będzie typu całkowitego.

>>> a = 4.0
>>> delta = b**2 - 4*(a*c)
>>> delta
9.0
>>> type(delta)
<class 'float'>
>>>

Żeby uzyskać dokładne obliczenia, polecam skorzystać z klasy Fraction (ang. ułamek).

>>> from fractions import Fraction
>>> a = Fraction(4)
>>> b = Fraction(5)
>>> c = Fraction(1)
>>> delta = b**2 - 4*(a*c)
>>> delta
Fraction(9, 1)
>>>

Czyli wynik jest równy: dziewięć pierwszych.

Przykłady wkleiłem z "interactive shell" Pythona. Po prostu w linii poleceń trzeba odpalić interpreter bez parametrów, żeby sobie wklepywać kolejne linie kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1