Roots of a quadratic function
Write a program to find the roots of a quadratic equation. i.e solve the equation ax2 + bx + c = 0.
You are encouraged to solve this task according to the task description, using any language you may know.
The program must correctly handle complex roots. Error checking on the input (for a = 0) need not be shown.
J
J has a built-in polynomial solver:
p.
Example (using inputs from other solutions):
coeff =. _3 |.\ 3 4 4r3 3 2 _1 3 2 1 > {:"1 p. coeff _0.666667 _0.666667 _1 0.333333 _0.333333j0.471405 _0.333333j_0.471405
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>