25 #ifndef WPOLYNOMIALEQUATIONSOLVERS_H
26 #define WPOLYNOMIALEQUATIONSOLVERS_H
33 #include "../exceptions/WEquationHasNoRoots.h"
34 #include "../WLimits.h"
49 template<
typename T >
typename std::pair< typename std::complex< T >,
typename std::complex< T > > solveRealQuadraticEquation(
T a,
T b,
T c );
53 template<
typename T >
54 inline typename std::pair< typename std::complex< T >,
typename std::complex< T > > solveRealQuadraticEquation(
T a,
T b,
T c )
56 typename std::pair< typename std::complex< T >,
typename std::complex< T > > result( std::complex< T >( 0.0, 0.0 ), std::complex< T >( 0.0, 0.0 ) );
66 ss <<
"The equation: " << a <<
"x^2 + " << b <<
"x + " << c <<
" = 0.0 has no solutions!";
76 result.first = std::complex< T >( -c / b, 0.0 );
77 result.second = result.first;
90 double discriminant = b * b - 4.0 * c;
91 if( discriminant < 0.0 )
93 result.first = std::complex< T >( -b / 2.0, std::sqrt( std::abs( discriminant ) ) / 2.0 );
94 result.second = std::complex< T >( -b / 2.0, -std::sqrt( std::abs( discriminant ) ) / 2.0 );
96 else if( discriminant > 0.0 )
98 result.first = std::complex< T >( -b / 2.0 + std::sqrt( discriminant ) / 2.0, 0.0 );
99 result.second = std::complex< T >( -b / 2.0 - std::sqrt( discriminant ) / 2.0 , 0.0 );
106 result.first = std::complex< T >( 0.0, 0.0 );
107 result.second = result.first;
111 result.first = std::complex< T >( -b / 2, 0.0 );
112 result.second = result.first;
118 #endif // WPOLYNOMIALEQUATIONSOLVERS_H