#include "triangle.h" #include #include #include namespace triangle { using namespace std; namespace { inline bool fuzzy_equal(double a, double b) { typedef numeric_limits limits_t; static const double &epsilon = limits_t::epsilon(); static const double &min = limits_t::min(); static const double &round_error = limits_t::round_error(); return abs(a - b) < epsilon * abs(a + b) * round_error || abs(a - b) < min; } inline bool is_valid(double a, double b, double c) { return a > 0 && b > 0 && c > 0 && a + b > c && a + c > b && b + c > a; } inline bool is_equilateral(double a, double b, double c) { return fuzzy_equal(a, b) && fuzzy_equal(a, c) && fuzzy_equal(b, c); } inline bool is_isosceles(double a, double b, double c) { return fuzzy_equal(a, b) || fuzzy_equal(a, c) || fuzzy_equal(b, c); } } kind_t kind(double a, double b, double c) { if (!is_valid(a, b, c)) throw domain_error("invalid triangle"); if (is_equilateral(a, b, c)) return equilateral; if (is_isosceles(a, b, c)) return isosceles; return scalene; } }