Roots of a quadratic function
You are encouraged to solve this task according to the task description, using any language you may know.
Write a program to find the roots of a quadratic equation. i.e solve the equation ax2 + bx + c = 0.
The program must correctly handle complex roots. Error checking on the input (for a = 0) need not be shown.
Fortran
PROGRAM QUADRATIC IMPLICIT NONE REAL :: a, b, c, e, discriminant, rroot1, rroot2 COMPLEX :: croot1, croot2 WRITE(*,*) "Enter the coefficients of the equation ax^2 + bx + c" WRITE(*, "(A)", ADVANCE="NO") "a = " READ *, a WRITE(*,"(A)", ADVANCE="NO") "b = " READ *, b WRITE(*,"(A)", ADVANCE="NO") "c = " READ *, c WRITE(*,"(3(A,F10.6))") "Coefficients are: a=", a, " b=", b, " c=", c e = 1e-5 discriminant = b*b - 4*a*c IF (ABS(discriminant) < e) THEN rroot1 = -b / (2*a) WRITE(*,*) "The roots are real and equal:" WRITE(*,*) "Root=", rroot1 ELSE IF (discriminant > 0) THEN rroot1 = (-b + SQRT(discriminant)) / (2*a) rroot2 = (-b - SQRT(discriminant)) / (2*a) WRITE(*,*) "The roots are real:" WRITE(*,*) "Root1=", rroot1, " Root2=", rroot2 ELSE croot1 = (-b + SQRT(CMPLX(discriminant))) / (2*a) croot2 = CONJG(croot1) WRITE(*,*) "The roots are complex:" WRITE(*,*) "Root1=", croot1, " Root2=", croot2 END IF END PROGRAM QUADRATIC
Sample output
Coefficients are: a= 3.000000 b= 4.000000 c= 1.333333 The roots are real and equal: Root= -0.666667 Coefficients are: a= 3.000000 b= 2.000000 c= -1.000000 The roots are real: Root1= 0.333333 Root2= -1.00000 Coefficients are: a= 3.000000 b= 2.000000 c= 1.000000 The roots are complex: Root1= (-0.33333,0.47140) Root2= (-0.33333,-0.47140)
Python
No attempt is made to categorize the type of output as this is not mentioned as being part of the task. <python>>>> def quad_roots(a,b,c): a,b,c =complex(a), complex(b), complex(c) discriminant = b*b - 4*a*c root1 = (-b + discriminant**0.5)/2./a root2 = (-b - discriminant**0.5)/2./a return root1, root2
>>> for coeffs in ((3, 4, 4/3.), (3, 2, -1), (3, 2, 1)): print "a, b, c =", coeffs print " (root1, root2) =", quad_roots(*coeffs)
a, b, c = (3, 4, 1.3333333333333333)
(root1, root2) = ((-0.66666666666666663+0j), (-0.66666666666666663+0j))
a, b, c = (3, 2, -1)
(root1, root2) = ((0.33333333333333331+0j), (-1+0j))
a, b, c = (3, 2, 1)
(root1, root2) = ((-0.33333333333333331+0.47140452079103173j), (-0.33333333333333331-0.47140452079103173j))
>>> </python>
Categorized roots version: <python>>>> def quad_discriminating_roots(a,b,c, entier = 1e-5): discriminant = b*b - 4*a*c a,b,c,d =complex(a), complex(b), complex(c), complex(discriminant) root1 = (-b + d**0.5)/2./a root2 = (-b - d**0.5)/2./a if abs(discriminant) < entier: return "real and equal", abs(root1), abs(root1) if discriminant > 0: return "real", root1.real, root2.real return "complex", root1, root2
>>> for coeffs in ((3, 4, 4/3.), (3, 2, -1), (3, 2, 1)): print "Roots of: %gX^2 %+gX %+g are" % coeffs print " %s: %s, %s" % quad_discriminating_roots(*coeffs)
Roots of: 3X^2 +4X +1.33333 are
real and equal: 0.666666666667, 0.666666666667
Roots of: 3X^2 +2X -1 are
real: 0.333333333333, -1.0
Roots of: 3X^2 +2X +1 are
complex: (-0.333333333333+0.471404520791j), (-0.333333333333-0.471404520791j)
>>> </python>