#include "../template/includes.cpp"
template<typenamefloat_type,constlonglonginv_eps>classfloat_tolerance{voidinit(){static_assert(std::is_floating_point<float_type>::value,"float_type must be real number");static_assert(inv_eps>=1000,"Too large tolerance");}public:staticconstexprfloat_typeeps=float_type(1)/inv_eps;float_typex;float_tolerance():x(0){init();}float_tolerance(float_typex_):x(x_){init();}explicitoperatorfloat_type(){returnx;}template<typenamecast_to>explicitoperatorcast_to(){returncast_to(x);}float_toleranceoperator-()const{return-x;}float_toleranceoperator+(constfloat_type&r)const{returnx+r;}float_toleranceoperator-(constfloat_type&r)const{returnx-r;}float_toleranceoperator*(constfloat_type&r)const{returnx*r;}float_toleranceoperator/(constfloat_type&r)const{returnx/r;}float_tolerance&operator+=(constfloat_type&r){returnx+=r,*this;}float_tolerance&operator-=(constfloat_type&r){returnx-=r,*this;}float_tolerance&operator*=(constfloat_type&r){returnx*=r,*this;}float_tolerance&operator/=(constfloat_type&r){returnx/=r,*this;}booloperator<=(constfloat_type&r)const{returnx<=r+eps;}booloperator<(constfloat_type&r)const{returnx<r-eps;}booloperator>=(constfloat_type&r)const{returnx>=r-eps;}booloperator>(constfloat_type&r)const{returnx>r+eps;}booloperator==(constfloat_type&r)const{returnx-r<eps&&r-x<eps;}booloperator!=(constfloat_type&r)const{returnx-r>eps||r-x>eps;}float_toleranceoperator+(constfloat_tolerance&r)const{returnx+r.x;}float_toleranceoperator-(constfloat_tolerance&r)const{returnx-r.x;}float_toleranceoperator*(constfloat_tolerance&r)const{returnx*r.x;}float_toleranceoperator/(constfloat_tolerance&r)const{returnx/r.x;}float_tolerance&operator+=(constfloat_tolerance&r){return*this+=r.x;}float_tolerance&operator-=(constfloat_tolerance&r){return*this-=r.x;}float_tolerance&operator*=(constfloat_tolerance&r){return*this*=r.x;}float_tolerance&operator/=(constfloat_tolerance&r){return*this/=r.x;}booloperator<=(constfloat_tolerance&r)const{return*this<=r.x;}booloperator<(constfloat_tolerance&r)const{return*this<r.x;}booloperator>=(constfloat_tolerance&r)const{return*this>=r.x;}booloperator>(constfloat_tolerance&r)const{return*this>r.x;}booloperator==(constfloat_tolerance&r)const{return*this==r.x;}booloperator!=(constfloat_tolerance&r)const{return*this!=r.x;}};template<typenameU,typenameT>usingif_arithmetic_t=typenamestd::enable_if<std::is_arithmetic<U>::value,T>::type;template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,float_tolerance<float_type,inv_eps>>operator+(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnstatic_cast<float_type>(l)+r.x;}template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,float_tolerance<float_type,inv_eps>>operator-(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnstatic_cast<float_type>(l)-r.x;}template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,float_tolerance<float_type,inv_eps>>operator*(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnstatic_cast<float_type>(l)*r.x;}template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,float_tolerance<float_type,inv_eps>>operator/(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnstatic_cast<float_type>(l)/r.x;}template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,bool>operator<=(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnr>=l;}template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,bool>operator<(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnr>l;}template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,bool>operator>=(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnr<=l;}template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,bool>operator>(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnr<l;}#if __cplusplus < 202002L
template<typenamelhs_type,typenamefloat_type,constlonglonginv_eps>if_arithmetic_t<lhs_type,bool>operator==(constlhs_type&l,constfloat_tolerance<float_type,inv_eps>&r){returnr==l;}#endif
template<typenamefloat_type,constlonglonginv_eps>float_tolerance<float_type,inv_eps>abs(constfloat_tolerance<float_type,inv_eps>&x){returnstd::abs(x.x);}template<typenamefloat_type,constlonglonginv_eps>float_tolerance<float_type,inv_eps>atan2(constfloat_tolerance<float_type,inv_eps>&x,constfloat_tolerance<float_type,inv_eps>&y){returnstd::atan2(x.x,y.x);}template<typenamefloat_type,constlonglonginv_eps>boolcopysign(constfloat_tolerance<float_type,inv_eps>&x,constfloat_tolerance<float_type,inv_eps>&y){returnstd::copysign(x.x,y.x);}template<typenamefloat_type,constlonglonginv_eps>boolisfinite(constfloat_tolerance<float_type,inv_eps>&x){returnstd::isfinite(x.x);}template<typenamefloat_type,constlonglonginv_eps>boolisinf(constfloat_tolerance<float_type,inv_eps>&x){returnstd::isinf(x.x);}template<typenamefloat_type,constlonglonginv_eps>boolisnan(constfloat_tolerance<float_type,inv_eps>&x){returnstd::isnan(x.x);}template<typenamefloat_type,constlonglonginv_eps>float_tolerance<float_type,inv_eps>sqrt(constfloat_tolerance<float_type,inv_eps>&x){returnstd::sqrt(x.x);}template<typenamefloat_type,constlonglonginv_eps>std::istream&operator>>(std::istream&is,float_tolerance<float_type,inv_eps>&x){is>>x.x;returnis;}template<typenamefloat_type,constlonglonginv_eps>std::ostream&operator<<(std::ostream&os,constfloat_tolerance<float_type,inv_eps>&x){os<<x.x;returnos;}usingfloat11=float_tolerance<longdouble,100000000000LL>;