Roots of a quadratic function

From Rosetta Code
Task
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

Works with: Fortran version 90 and later
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>