Click here to Skip to main content
Click here to Skip to main content

A simple program to solve quadratic equations with

By , 10 Nov 2010
 
The correct way to solve quadratic equations is none of the above. For the correct algorithm as applied in the following function, see
numerical recipes in C and the Wolfram site at http://mathworld.wolfram.com/QuadraticEquation.html
 
#include <limits>
bool quadratic(double a, double b, double c, double& x1, double& x2, double y, double z)
{
   double delta=0.0e+00, q=0.0e+00, bsign, y1, y2;
   const double eps = std::numeric_limits()<double>.epsilon();
   // equation is: a*x^2 + b*x + c = 0; a cannot be zero.
   if ( fabs(a) <= eps ) { return false; }
 
   delta=b*b-4.0*a*c;
   if ( delta<0.0e+00 ) { return false; }
   if ( delta>=0.0e+00 && delta <= eps )
   { x1=(-1.0*b/(2.0*a)); x2=x1; return true; }
 
   bsign=1.0e+00;
   if ( fabs(b)>1.0e-16 )  { bsign=b/fabs(b); }
   else { if ( b<0.0e+00 ) { bsign=-1.0e+00; } }
 
   q=(-0.5)*(b+bsign*sqrt(delta));
 
   // the roots of the equation are:
   y1=q/a; y2=c/q;
 
   // find if any of the roots is in the given [y,z] interval
   if (( y<=y1 )&&( y1<=z ))
   {
      x1=y1; x2=y2;
   }
   else if (( y<=y2 )&&( y2<=z ))
   {
      x1=y2; x2=y1;
   }
   else
   {
      x1=y1; x2=y2;
   }
 
   return true;
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

federico.strati
Software Developer (Senior)
Italy Italy
Member
Senior Software Developer in C/C++ and Oracle.
Ex-physicist holding a Ph.D. on x-ray lasers.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralI edited my answser to address your objection. evviva :)memberAlain Rist16 Nov '10 - 7:17 
GeneralOh well, thanks Alain, I didn't know the standard evoluted t...memberfederico.strati9 Nov '10 - 23:07 
General#include &lt;limits&gt; const double eps = std::numeric_limi...memberAlain Rist9 Nov '10 - 22:34 
GeneralOh well, the machine epsilon is around 3x10-8 for single pre...memberfederico.strati9 Nov '10 - 4:38 
GeneralReason for my vote of 2 Aren't the tolerance values arbitrar...memberYvesDaoust8 Nov '10 - 23:30 
GeneralThe inputs "y" and "z" serve the only purpose of finding a r...memberfederico.strati8 Nov '10 - 22:23 
GeneralCan you elaborate on the function of the 2 added inputs y an...memberbstrack8 Nov '10 - 21:27 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 10 Nov 2010
Article Copyright 2010 by federico.strati
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid