limits
上传用户:nizebo
上传日期:2022-05-14
资源大小:882k
文件大小:20k
源码类别:

STL

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1997
  3.  * Silicon Graphics Computer Systems, Inc.
  4.  *
  5.  * Permission to use, copy, modify, distribute and sell this software
  6.  * and its documentation for any purpose is hereby granted without fee,
  7.  * provided that the above copyright notice appear in all copies and
  8.  * that both that copyright notice and this permission notice appear
  9.  * in supporting documentation.  Silicon Graphics makes no
  10.  * representations about the suitability of this software for any
  11.  * purpose.  It is provided "as is" without express or implied warranty.
  12.  */
  13. /* NOTE: This is not portable code.  Parts of numeric_limits<> are
  14.  * inherently machine-dependent.  At present this file is suitable
  15.  * for the MIPS and ia32 architectures.
  16.  */
  17. #ifndef __SGI_CPP_LIMITS
  18. #define __SGI_CPP_LIMITS
  19. #include <limits.h>
  20. #include <float.h>
  21. #include <stl_config.h>
  22. __STL_BEGIN_NAMESPACE
  23. enum float_round_style {
  24.   round_indeterminate       = -1,
  25.   round_toward_zero         =  0,
  26.   round_to_nearest          =  1,
  27.   round_toward_infinity     =  2,
  28.   round_toward_neg_infinity =  3
  29. };
  30. enum float_denorm_style {
  31.   denorm_indeterminate = -1,
  32.   denorm_absent        =  0,
  33.   denorm_present       =  1
  34. };
  35. // The C++ standard (section 18.2.1) requires that some of the members of
  36. // numeric_limits be static const data members that are given constant-
  37. // initializers within the class declaration.  On compilers where the
  38. // __STL_STATIC_CONST_INIT_BUG macro is defined, it is impossible to write
  39. // a standard-conforming numeric_limits class.
  40. //
  41. // There are two possible workarounds: either initialize the data
  42. // members outside the class, or change them from data members to
  43. // enums.  Neither workaround is satisfactory: the former makes it
  44. // impossible to use the data members in constant-expressions, and the
  45. // latter means they have the wrong type and that it is impossible to
  46. // take their addresses.  We choose the former workaround.
  47. #ifdef __STL_STATIC_CONST_INIT_BUG
  48. # define __STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) 
  49.   enum { __mem_name = __mem_value }
  50. #else /* __STL_STATIC_CONST_INIT_BUG */
  51. # define __STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) 
  52.   static const __mem_type __mem_name = __mem_value
  53. #endif /* __STL_STATIC_CONST_INIT_BUG */
  54. // Base class for all specializations of numeric_limits.
  55. template <class __number>
  56. class _Numeric_limits_base {
  57. public:
  58.   __STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, false);
  59.   static __number min() __STL_NOTHROW { return __number(); }
  60.   static __number max() __STL_NOTHROW { return __number(); }
  61.   __STL_DECLARE_LIMITS_MEMBER(int, digits,   0);
  62.   __STL_DECLARE_LIMITS_MEMBER(int, digits10, 0);
  63.   __STL_DECLARE_LIMITS_MEMBER(bool, is_signed,  false);
  64.   __STL_DECLARE_LIMITS_MEMBER(bool, is_integer, false);
  65.   __STL_DECLARE_LIMITS_MEMBER(bool, is_exact,   false);
  66.   __STL_DECLARE_LIMITS_MEMBER(int, radix, 0);
  67.   static __number epsilon() __STL_NOTHROW     { return __number(); }
  68.   static __number round_error() __STL_NOTHROW { return __number(); }
  69.   __STL_DECLARE_LIMITS_MEMBER(int, min_exponent,   0);
  70.   __STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, 0);
  71.   __STL_DECLARE_LIMITS_MEMBER(int, max_exponent,   0);
  72.   __STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, 0);
  73.   __STL_DECLARE_LIMITS_MEMBER(bool, has_infinity,      false);
  74.   __STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN,     false);
  75.   __STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, false);
  76.   __STL_DECLARE_LIMITS_MEMBER(float_denorm_style,
  77.                               has_denorm,
  78.                               denorm_absent);
  79.   __STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss,   false);
  80.   static __number infinity() __STL_NOTHROW      { return __number(); }
  81.   static __number quiet_NaN() __STL_NOTHROW     { return __number(); }
  82.   static __number signaling_NaN() __STL_NOTHROW { return __number(); }
  83.   static __number denorm_min() __STL_NOTHROW    { return __number(); }
  84.   __STL_DECLARE_LIMITS_MEMBER(bool, is_iec559,  false);
  85.   __STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, false);
  86.   __STL_DECLARE_LIMITS_MEMBER(bool, is_modulo,  false);
  87.   __STL_DECLARE_LIMITS_MEMBER(bool, traps,            false);
  88.   __STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before,  false);
  89.   __STL_DECLARE_LIMITS_MEMBER(float_round_style,
  90.                               round_style,
  91.                               round_toward_zero);
  92. };
  93. #ifdef __STL_STATIC_CONST_INIT_BUG
  94. # define __STL_DEFINE_NUMERIC_BASE_MEMBER(__type, __mem)
  95. #else /* __STL_STATIC_CONST_INIT_BUG */
  96. # define __STL_DEFINE_NUMERIC_BASE_MEMBER(__type, __mem) 
  97.   template <class __number>                              
  98.   const __type _Numeric_limits_base<__number>:: __mem
  99. #endif /* __STL_STATIC_CONST_INIT_BUG */
  100. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_specialized);
  101. __STL_DEFINE_NUMERIC_BASE_MEMBER(int, digits);
  102. __STL_DEFINE_NUMERIC_BASE_MEMBER(int, digits10);
  103. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_signed);
  104. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_integer);
  105. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_exact);
  106. __STL_DEFINE_NUMERIC_BASE_MEMBER(int, radix);
  107. __STL_DEFINE_NUMERIC_BASE_MEMBER(int, min_exponent);
  108. __STL_DEFINE_NUMERIC_BASE_MEMBER(int, max_exponent);
  109. __STL_DEFINE_NUMERIC_BASE_MEMBER(int, min_exponent10);
  110. __STL_DEFINE_NUMERIC_BASE_MEMBER(int, max_exponent10);
  111. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, has_infinity);
  112. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, has_quiet_NaN);
  113. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, has_signaling_NaN);
  114. __STL_DEFINE_NUMERIC_BASE_MEMBER(float_denorm_style, has_denorm);
  115. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, has_denorm_loss);
  116. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_iec559);
  117. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_bounded);
  118. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, is_modulo);
  119. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, traps);
  120. __STL_DEFINE_NUMERIC_BASE_MEMBER(bool, tinyness_before);
  121. __STL_DEFINE_NUMERIC_BASE_MEMBER(float_round_style, round_style);
  122. // Base class for integers.
  123. template <class _Int,
  124.           _Int __imin, _Int __imax,
  125.           int __idigits = -1, bool __ismod = true>
  126. class _Integer_limits : public _Numeric_limits_base<_Int> 
  127. {
  128. public:
  129.   __STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true);
  130.   static _Int min() __STL_NOTHROW { return __imin; }
  131.   static _Int max() __STL_NOTHROW { return __imax; }
  132.   __STL_DECLARE_LIMITS_MEMBER(int,
  133.                               digits,
  134.                               (__idigits < 0) ? (int)(sizeof(_Int) * CHAR_BIT)
  135.                                                    - (__imin == 0 ? 0 : 1) 
  136.                                               : __idigits);
  137.   __STL_DECLARE_LIMITS_MEMBER(int, digits10, (digits * 301) / 1000); 
  138.                                 // log 2 = 0.301029995664...
  139.   __STL_DECLARE_LIMITS_MEMBER(bool, is_signed,  __imin != 0);
  140.   __STL_DECLARE_LIMITS_MEMBER(bool, is_integer, true);
  141.   __STL_DECLARE_LIMITS_MEMBER(bool, is_exact,   true);
  142.   __STL_DECLARE_LIMITS_MEMBER(int,  radix,      2);
  143.   __STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true);
  144.   __STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, __ismod);
  145. };
  146. #ifdef __STL_STATIC_CONST_INIT_BUG
  147. # define __STL_DEFINE_INTEGER_LIMITS_MEMBER(__type, __mem)
  148. #else /* __STL_STATIC_CONST_INIT_BUG */
  149. # define __STL_DEFINE_INTEGER_LIMITS_MEMBER(__type, __mem)              
  150.   template <class _Int, _Int __imin, _Int __imax, int __idig, bool __ismod>  
  151.   const __type _Integer_limits<_Int, __imin, __imax, __idig, __ismod>::__mem
  152. #endif /* __STL_STATIC_CONST_INIT_BUG */
  153. __STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_specialized);
  154. __STL_DEFINE_INTEGER_LIMITS_MEMBER(int, digits);
  155. __STL_DEFINE_INTEGER_LIMITS_MEMBER(int, digits10);
  156. __STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_signed);
  157. __STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_integer);
  158. __STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_exact);
  159. __STL_DEFINE_INTEGER_LIMITS_MEMBER(int, radix);
  160. __STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_bounded);
  161. __STL_DEFINE_INTEGER_LIMITS_MEMBER(bool, is_modulo);
  162. // Base class for floating-point numbers.
  163. template <class __number,
  164.          int __Digits, int __Digits10,
  165.          int __MinExp, int __MaxExp,
  166.          int __MinExp10, int __MaxExp10,
  167.          bool __IsIEC559,
  168.          float_round_style __RoundStyle>
  169. class _Floating_limits : public _Numeric_limits_base<__number>
  170. {
  171. public:
  172.   __STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true);
  173.   __STL_DECLARE_LIMITS_MEMBER(int, digits,   __Digits);
  174.   __STL_DECLARE_LIMITS_MEMBER(int, digits10, __Digits10);
  175.   __STL_DECLARE_LIMITS_MEMBER(bool, is_signed, true);
  176.   __STL_DECLARE_LIMITS_MEMBER(int, radix, 2);
  177.   __STL_DECLARE_LIMITS_MEMBER(int, min_exponent,   __MinExp);
  178.   __STL_DECLARE_LIMITS_MEMBER(int, max_exponent,   __MaxExp);
  179.   __STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, __MinExp10);
  180.   __STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, __MaxExp10);
  181.   __STL_DECLARE_LIMITS_MEMBER(bool, has_infinity,      true);
  182.   __STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN,     true);
  183.   __STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, true);
  184.   __STL_DECLARE_LIMITS_MEMBER(float_denorm_style,
  185.                               has_denorm,
  186.                               denorm_indeterminate);
  187.   __STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss,   false);
  188.   __STL_DECLARE_LIMITS_MEMBER(bool, is_iec559,       __IsIEC559);
  189.   __STL_DECLARE_LIMITS_MEMBER(bool, is_bounded,      true);
  190.   __STL_DECLARE_LIMITS_MEMBER(bool, traps,           true);
  191.   __STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false);
  192.   __STL_DECLARE_LIMITS_MEMBER(float_round_style, round_style, __RoundStyle);
  193. };
  194. #ifdef __STL_STATIC_CONST_INIT_BUG
  195. # define __STL_DEFINE_FLOAT_LIMITS_MEMBER(__type, __mem)
  196. #else /* __STL_STATIC_CONST_INIT_BUG */
  197. # define __STL_DEFINE_FLOAT_LIMITS_MEMBER(__type, __mem)                   
  198.   template <class __Num, int __Dig, int __Dig10,                           
  199.             int __MnX, int __MxX, int __MnX10, int __MxX10,                
  200.             bool __IsIEEE, float_round_style __Sty>                        
  201.   const __type _Floating_limits<__Num, __Dig, __Dig10,                     
  202.                                 __MnX, __MxX, __MnX10, __MxX10,            
  203.                                 __IsIEEE, __Sty>:: __mem
  204. #endif /* __STL_STATIC_CONST_INIT_BUG */
  205. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, is_specialized);  
  206. __STL_DEFINE_FLOAT_LIMITS_MEMBER(int, digits);  
  207. __STL_DEFINE_FLOAT_LIMITS_MEMBER(int, digits10);  
  208. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, is_signed);  
  209. __STL_DEFINE_FLOAT_LIMITS_MEMBER(int, radix);  
  210. __STL_DEFINE_FLOAT_LIMITS_MEMBER(int, min_exponent);  
  211. __STL_DEFINE_FLOAT_LIMITS_MEMBER(int, max_exponent);  
  212. __STL_DEFINE_FLOAT_LIMITS_MEMBER(int, min_exponent10);  
  213. __STL_DEFINE_FLOAT_LIMITS_MEMBER(int, max_exponent10);  
  214. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, has_infinity);
  215. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, has_quiet_NaN);
  216. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, has_signaling_NaN);
  217. __STL_DEFINE_FLOAT_LIMITS_MEMBER(float_denorm_style, has_denorm);
  218. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, has_denorm_loss);
  219. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, is_iec559);
  220. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, is_bounded);
  221. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, traps);
  222. __STL_DEFINE_FLOAT_LIMITS_MEMBER(bool, tinyness_before);
  223. __STL_DEFINE_FLOAT_LIMITS_MEMBER(float_round_style, round_style);
  224. #undef __STL_DECLARE_NUMERIC_LIMITS_MEMBER
  225. #undef __STL_DEFINE_NUMERIC_BASE_MEMBER
  226. #undef __STL_DEFINE_INTEGER_LIMITS_MEMBER
  227. #undef __STL_DEFINE_FLOAT_LIMITS_MEMBER
  228. // Class numeric_limits
  229. // The unspecialized class.
  230. template<class _Tp> 
  231. class numeric_limits : public _Numeric_limits_base<_Tp> {};
  232. // Specializations for all built-in integral types.
  233. #ifndef __STL_NO_BOOL
  234. __STL_TEMPLATE_NULL
  235. class numeric_limits<bool>
  236.   : public _Integer_limits<bool, false, true, 1, false>
  237. {};
  238. #endif /* __STL_NO_BOOL */
  239. __STL_TEMPLATE_NULL
  240. class numeric_limits<char>
  241.   : public _Integer_limits<char, CHAR_MIN, CHAR_MAX>
  242. {};
  243. __STL_TEMPLATE_NULL
  244. class numeric_limits<signed char>
  245.   : public _Integer_limits<signed char, SCHAR_MIN, SCHAR_MAX>
  246. {};
  247. __STL_TEMPLATE_NULL
  248. class numeric_limits<unsigned char>
  249.   : public _Integer_limits<unsigned char, 0, UCHAR_MAX>
  250. {};
  251. #ifdef __STL_HAS_WCHAR_T
  252. __STL_TEMPLATE_NULL
  253. class numeric_limits<wchar_t>
  254.   : public _Integer_limits<wchar_t, INT_MIN, INT_MAX>
  255. {};
  256. #endif
  257. __STL_TEMPLATE_NULL
  258. class numeric_limits<short>
  259.   : public _Integer_limits<short, SHRT_MIN, SHRT_MAX>
  260. {};
  261. __STL_TEMPLATE_NULL
  262. class numeric_limits<unsigned short>
  263.   : public _Integer_limits<unsigned short, 0, USHRT_MAX>
  264. {};
  265. __STL_TEMPLATE_NULL
  266. class numeric_limits<int>
  267.   : public _Integer_limits<int, INT_MIN, INT_MAX>
  268. {};
  269. __STL_TEMPLATE_NULL
  270. class numeric_limits<unsigned int>
  271.   : public _Integer_limits<unsigned int, 0, UINT_MAX>
  272. {};
  273. __STL_TEMPLATE_NULL
  274. class numeric_limits<long>
  275.   : public _Integer_limits<long, LONG_MIN, LONG_MAX>
  276. {};
  277. __STL_TEMPLATE_NULL
  278. class numeric_limits<unsigned long>
  279.   : public _Integer_limits<unsigned long, 0, ULONG_MAX>
  280. {};
  281. #ifdef __STL_LONG_LONG
  282. // Some compilers have long long, but don't define the
  283. // LONGLONG_MIN and LONGLONG_MAX macros in limits.h.  This
  284. // assumes that long long is 64 bits.
  285. #if !defined(LONGLONG_MIN) && !defined(LONGLONG_MAX) 
  286.                            && !defined(ULONGLONG_MAX)
  287. #define ULONGLONG_MAX 0xffffffffffffffffLLU
  288. #define LONGLONG_MAX 0x7fffffffffffffffLL
  289. #define LONGLONG_MIN (-LONGLONG_MAX - 1LL)
  290. #endif
  291. __STL_TEMPLATE_NULL
  292. class numeric_limits<long long>
  293.   : public _Integer_limits<long long, LONGLONG_MIN, LONGLONG_MAX>
  294. {};
  295. __STL_TEMPLATE_NULL
  296. class numeric_limits<unsigned long long>
  297.   : public _Integer_limits<unsigned long long, 0, ULONGLONG_MAX>
  298. {};
  299. #endif /* __STL_LONG_LONG */
  300. // Specializations for all built-in floating-point type.
  301. __STL_TEMPLATE_NULL class numeric_limits<float>
  302.   : public _Floating_limits<float, 
  303.                             FLT_MANT_DIG,   // Binary digits of precision
  304.                             FLT_DIG,        // Decimal digits of precision
  305.                             FLT_MIN_EXP,    // Minimum exponent
  306.                             FLT_MAX_EXP,    // Maximum exponent
  307.                             FLT_MIN_10_EXP, // Minimum base 10 exponent
  308.                             FLT_MAX_10_EXP, // Maximum base 10 exponent
  309.                             true,           // conforms to iec559
  310.                             round_to_nearest>
  311. {
  312. public:
  313.   static float min() __STL_NOTHROW { return FLT_MIN; }
  314.   static float denorm_min() __STL_NOTHROW { return FLT_MIN; }
  315.   static float max() __STL_NOTHROW { return FLT_MAX; }
  316.   static float epsilon() __STL_NOTHROW { return FLT_EPSILON; }
  317.   static float round_error() __STL_NOTHROW { return 0.5f; } // Units: ulps.
  318.   static float infinity() __STL_NOTHROW;
  319.   static float quiet_NaN() __STL_NOTHROW;
  320.   static float signaling_NaN() __STL_NOTHROW;
  321. };
  322. __STL_TEMPLATE_NULL class numeric_limits<double>
  323.   : public _Floating_limits<double, 
  324.                             DBL_MANT_DIG,   // Binary digits of precision
  325.                             DBL_DIG,        // Decimal digits of precision
  326.                             DBL_MIN_EXP,    // Minimum exponent
  327.                             DBL_MAX_EXP,    // Maximum exponent
  328.                             DBL_MIN_10_EXP, // Minimum base 10 exponent
  329.                             DBL_MAX_10_EXP, // Maximum base 10 exponent
  330.                             true,           // conforms to iec559
  331.                             round_to_nearest>
  332. {
  333. public:
  334.   static double min() __STL_NOTHROW { return DBL_MIN; }
  335.   static double denorm_min() __STL_NOTHROW { return DBL_MIN; }
  336.   static double max() __STL_NOTHROW { return DBL_MAX; }
  337.   static double epsilon() __STL_NOTHROW { return DBL_EPSILON; }
  338.   static double round_error() __STL_NOTHROW { return 0.5; } // Units: ulps.
  339.   static double infinity() __STL_NOTHROW;
  340.   static double quiet_NaN() __STL_NOTHROW;
  341.   static double signaling_NaN() __STL_NOTHROW;
  342. };
  343. __STL_TEMPLATE_NULL class numeric_limits<long double>
  344.   : public _Floating_limits<long double, 
  345.                             LDBL_MANT_DIG,  // Binary digits of precision
  346.                             LDBL_DIG,       // Decimal digits of precision
  347.                             LDBL_MIN_EXP,   // Minimum exponent
  348.                             LDBL_MAX_EXP,   // Maximum exponent
  349.                             LDBL_MIN_10_EXP,// Minimum base 10 exponent
  350.                             LDBL_MAX_10_EXP,// Maximum base 10 exponent
  351.                             false,          // Doesn't conform to iec559
  352.                             round_to_nearest>
  353. {
  354. public:
  355.   static long double min() __STL_NOTHROW { return LDBL_MIN; }
  356.   static long double denorm_min() __STL_NOTHROW { return LDBL_MIN; }
  357.   static long double max() __STL_NOTHROW { return LDBL_MAX; }
  358.   static long double epsilon() __STL_NOTHROW { return LDBL_EPSILON; }
  359.   static long double round_error() __STL_NOTHROW { return 4; } // Units: ulps.
  360.   static long double infinity() __STL_NOTHROW;
  361.   static long double quiet_NaN() __STL_NOTHROW;
  362.   static long double signaling_NaN() __STL_NOTHROW;
  363. };
  364. // We write special values (Inf and NaN) as bit patterns and 
  365. // cast the the appropriate floating-point types. 
  366. #if defined(_MIPSEB)
  367. // Big-endian MIPS.  float is 32 bits, double 64, long double 128.
  368. #define _Define_float(__f, __h, __l)                                     
  369.    inline float numeric_limits<float>::__f() __STL_NOTHROW {             
  370.      static const unsigned short __x[2] = { __h, __l };                  
  371.      return *reinterpret_cast<const float*>(__x); }
  372. #define _Define_double(__f, __h, __l)                                    
  373.    inline double numeric_limits<double>::__f() __STL_NOTHROW {           
  374.      static const unsigned short __x[4] = { __h, __l };                  
  375.      return *reinterpret_cast<const double*>(__x); }
  376. #define _Define_ldouble(__f, __h, __l)                                   
  377.    inline long double numeric_limits<long double>::__f() __STL_NOTHROW { 
  378.      static const unsigned short __x[8] = { __h, __l };                  
  379.      return *reinterpret_cast<const long double*>(__x); }
  380. _Define_float(infinity, 0x7f80, 0)
  381. _Define_float(quiet_NaN, 0x7f81, 0)
  382. _Define_float(signaling_NaN, 0x7fc1, 0)
  383. _Define_double(infinity, 0x7ff0, 0)
  384. _Define_double(quiet_NaN, 0x7ff1, 0)
  385. _Define_double(signaling_NaN, 0x7ff9, 0)
  386. _Define_ldouble(infinity, 0x7ff0, 0)
  387. _Define_ldouble(quiet_NaN, 0x7ff1, 0)
  388. _Define_ldouble(signaling_NaN, 0x7ff9, 0)
  389. #elif defined(__i386) || defined(_M_IX86)
  390. // Little-endian ia32.  float is 32 bits, double 64, long double 80.
  391. #define _Define_float(__f, __h, __l)                                     
  392.    inline float numeric_limits<float>::__f() __STL_NOTHROW {             
  393.      static const unsigned short __x[2] = { __l, __h };                  
  394.      return *reinterpret_cast<const float*>(__x); }
  395. #define _Define_double(__f, __h, __l)                                    
  396.    inline double numeric_limits<double>::__f() __STL_NOTHROW {           
  397.      static const unsigned short __x[4] = { 0, 0, __l, __h };            
  398.      return *reinterpret_cast<const double*>(__x); }
  399. #define _Define_ldouble(__f, __h, __l)                                   
  400.    inline long double numeric_limits<long double>::__f() __STL_NOTHROW { 
  401.      static const unsigned short __x[5] = { 0, 0, 0, __l, __h };         
  402.      return *reinterpret_cast<const long double*>(__x); }
  403. _Define_float(infinity, 0x7f80, 0)
  404. _Define_float(quiet_NaN, 0x7fa0, 0)
  405. _Define_float(signaling_NaN, 0x7fc0, 0)
  406. _Define_double(infinity, 0x7ff0, 0)
  407. _Define_double(quiet_NaN, 0x7ff4, 0)
  408. _Define_double(signaling_NaN, 0x7ff8, 0)
  409. _Define_ldouble(infinity, 0x7fff, 0x8000)
  410. _Define_ldouble(quiet_NaN, 0x7fff, 0xa000)
  411. _Define_ldouble(signaling_NaN, 0x7fff, 0xc000)
  412. #else 
  413. /* This is an architecture we don't know how to handle.  Return some 
  414.    obviously wrong values. */
  415. #define _Define_float(__f)                                               
  416.    inline float numeric_limits<float>::__f() __STL_NOTHROW {             
  417.      return 0; }
  418. #define _Define_double(__f)                                              
  419.    inline double numeric_limits<double>::__f() __STL_NOTHROW {           
  420.      return 0; }
  421. #define _Define_ldouble(__f)                                             
  422.    inline long double numeric_limits<long double>::__f() __STL_NOTHROW { 
  423.      return 0; }
  424. _Define_float(infinity)
  425. _Define_float(quiet_NaN)
  426. _Define_float(signaling_NaN)
  427. _Define_double(infinity)
  428. _Define_double(quiet_NaN)
  429. _Define_double(signaling_NaN)
  430. _Define_ldouble(infinity)
  431. _Define_ldouble(quiet_NaN)
  432. _Define_ldouble(signaling_NaN)   
  433. #endif
  434. #undef _Define_float
  435. #undef _Define_double
  436. #undef _Define_ldouble
  437. __STL_END_NAMESPACE
  438. #endif /* __SGI_CPP_LIMITS */
  439. // Local Variables:
  440. // mode:C++
  441. // End: