// Specialize ZZ, quad_float and RR for numeric_limits. using std::numeric_limits; using NTL::quad_float; template <> class numeric_limits { public: static const bool is_specialized = true; static const int radix = 2; static const int digits = 106; // radix digits (bits) in significand. static const int digits10 = 31; // decimal digits guaranteed. static const int max_digits = 33; // maximum significant decimal digits. static const bool is_signed = true; static const bool is_integer = false; static const bool is_exact = false; static quad_float min() throw() { return numeric_limits::min();}; static quad_float max() throw() { return quad_float(numeric_limits::max(), numeric_limits::max());}; static quad_float epsilon() throw() { return 2.4651903288156618919116517665087069677288E-32;}; // 2^(1-106) == 2^105 static quad_float round_error() throw() { return 0.5;}; static quad_float infinity() throw() { return quad_float(numeric_limits::infinity(), numeric_limits::infinity());}; static quad_float quiet_NaN() throw() { return quad_float(numeric_limits::quiet_NaN(), numeric_limits::quiet_NaN());}; static quad_float signaling_NaN() throw() { return quad_float(numeric_limits::quiet_NaN(), numeric_limits::quiet_NaN());}; static quad_float denorm_min() throw() { return quad_float(0, numeric_limits::denorm_min());}; static const int min_exponent = numeric_limits::min_exponent; static const int min_exponent10 = numeric_limits::min_exponent10; static const int max_exponent = numeric_limits::max_exponent; static const int max_exponent10 = numeric_limits::max_exponent10; static const bool has_infinity = true; static const bool has_quiet_NaN = true; static const bool has_signaling_NaN = true; static const float_denorm_style has_denorm = denorm_absent; // enum from static const bool has_denorm_loss = false; static const bool is_ies559 = false; static const bool is_bounded = true; static const bool is_modulo = true; static const bool traps = true; static const bool tinyness_before = true; static const float_round_style round_style = round_to_nearest; // enum from }; // class numeric_limits // Need to fix precision of RR class before specialization. // long RR::prec = 150; is in RR.cpp, // so need a macro in RR.h to be used in RR.cpp instead of 150 #define RR_PRECISION 150 using NTL::RR; template <> class numeric_limits { public: static const bool is_specialized = true; static const int radix = 10; static const int digits = RR_PRECISION; // Radix digits (decimal) in significand. ??? static const int digits10 =RR_PRECISION -1; // Decimal digits guaranteed. static const int max_digits = RR_PRECISION; // Maximum significant decimal digits. static const bool is_signed = true; static const bool is_integer = false; static const bool is_exact = false; static RR min() throw() { return 0.;}; static RR max() throw() { return NTL_OVFBND;}; static RR epsilon() throw() { return pow(2., precision());}; static RR round_error() throw() { return 0.5;}; static RR infinity() throw() { return RR(numeric_limits::infinity())}; static RR quiet_NaN() throw() { return RR(numeric_limits::quiet_NaN())}; static RR signaling_NaN() throw() { return RR(numeric_limits::quiet_NaN());}; static RR denorm_min() throw() { return RR(numeric_limits::denorm_min());}; static const int min_exponent = numeric_limits::min_exponent; static const int min_exponent10 = numeric_limits::min_exponent10; static const int max_exponent = numeric_limits::max_exponent; static const int max_exponent10 = numeric_limits::max_exponent10; static const bool has_infinity = true; static const bool has_quiet_NaN = true; static const bool has_signaling_NaN = true; static const float_denorm_style has_denorm = denorm_absent; // enum from static const bool has_denorm_loss = false; static const bool is_ies559 = false; static const bool is_bounded = true; static const bool is_modulo = true; static const bool traps = false; static const bool tinyness_before = false; static const float_round_style round_style = round_to_nearest; // enum from }; // class numeric_limits using NTL::ZZ; template <> class numeric_limits { // Defined-precision integer class. public: static const bool is_specialized = true; static const int radix = 2; static const int digits = NTL_ZZ_NBITS; // radix digits (bits). static const int digits10 = NTL_FRADIX; // decimal digits guaranteed. static const int max_digits = NTL_FRADIX; // maximum significant decimal digits. static const bool is_signed = true; static const bool is_integer = true; static const bool is_exact = true; static ZZ min() throw() { return -(NTL_ZZ_NBITS+1);}; static ZZ max() throw() { return NTL_ZZ_NBITS);}; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const bool has_denorm_loss = false; static const bool is_ies559 = false; static const bool is_bounded = true; static const bool is_modulo = true; static const bool traps = false; static const bool tinyness_before = false; }; // class numeric_limits