25 #ifndef WPOLYNOMIALEQUATIONSOLVERS_H
26 #define WPOLYNOMIALEQUATIONSOLVERS_H
32 #include "../exceptions/WEquationHasNoRoots.h"
33 #include "../WLimits.h"
48 template<
typename T >
typename std::pair< typename std::complex< T >,
typename std::complex< T > > solveRealQuadraticEquation( T a, T b, T c );
52 template<
typename T >
53 inline typename std::pair< typename std::complex< T >,
typename std::complex< T > > solveRealQuadraticEquation( T a, T b, T c )
55 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 ) );
65 ss <<
"The equation: " << a <<
"x^2 + " << b <<
"x + " << c <<
" = 0.0 has no solutions!";
75 result.first = std::complex< T >( -c / b, 0.0 );
76 result.second = result.first;
89 double discriminant = b * b - 4.0 * c;
90 if( discriminant < 0.0 )
92 result.first = std::complex< T >( -b / 2.0, std::sqrt( std::abs( discriminant ) ) / 2.0 );
93 result.second = std::complex< T >( -b / 2.0, -std::sqrt( std::abs( discriminant ) ) / 2.0 );
95 else if( discriminant > 0.0 )
97 result.first = std::complex< T >( -b / 2.0 + std::sqrt( discriminant ) / 2.0, 0.0 );
98 result.second = std::complex< T >( -b / 2.0 - std::sqrt( discriminant ) / 2.0 , 0.0 );
105 result.first = std::complex< T >( 0.0, 0.0 );
106 result.second = result.first;
110 result.first = std::complex< T >( -b / 2, 0.0 );
111 result.second = result.first;
Indicates invalid element access of a container.
const double DBL_EPS
Smallest double such: 1.0 + DBL_EPS == 1.0 is still true.