<!--
    Licensed to the Apache Software  Foundation (ASF) under one or more
    contributor  license agreements.  See  the NOTICE  file distributed
    with  this  work  for  additional information  regarding  copyright
    ownership.   The ASF  licenses this  file to  you under  the Apache
    License, Version  2.0 (the  License); you may  not use  this file
    except in  compliance with the License.   You may obtain  a copy of
    the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the  License is distributed on an  "AS IS" BASIS,
    WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
    implied.   See  the License  for  the  specific language  governing
    permissions and limitations under the License.

    Copyright 1999-2007 Rogue Wave Software, Inc.
-->

<HTML>
<HEAD>
<TITLE>numeric_limits</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="numeric-h.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="numpunct.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>numeric_limits</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-2.html">Language support</A></P>

<PRE><HR><B><I>Does not inherit</I></B><HR></PRE>

<UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">Specializations</A></LI>
<LI><A HREF="#sec5">Description</A></LI>
<LI><A HREF="#sec6">Interface</A></LI>
<LI><A HREF="#sec7">Member Fields and Functions</A></LI>
<LI><A HREF="#sec8">Warnings</A></LI>
<LI><A HREF="#sec9">See Also</A></LI>
<LI><A HREF="#sec10">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
<H4>Members</H4>
<UL><TABLE CELLPADDING=3>
<TR><TD VALIGN=top>
<A HREF="#idx1011">denorm_min()</A><BR>
<A HREF="#idx1012">digits</A><BR>
<A HREF="#idx1013">digits10</A><BR>
<A HREF="#idx1014">epsilon()</A><BR>
<A HREF="#idx1015">has_denorm</A><BR>
<A HREF="#idx1016">has_denorm_loss</A><BR>
<A HREF="#idx1017">has_infinity</A><BR>
<A HREF="#idx1018">has_quiet_NaN</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx1019">has_signaling_NaN</A><BR>
<A HREF="#idx1020">infinity()</A><BR>
<A HREF="#idx1021">is_bounded</A><BR>
<A HREF="#idx1022">is_exact</A><BR>
<A HREF="#idx1023">is_iec559</A><BR>
<A HREF="#idx1024">is_integer</A><BR>
<A HREF="#idx1025">is_modulo</A><BR>
<A HREF="#idx1026">is_signed</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx1027">is_specialized</A><BR>
<A HREF="#idx1028">max()</A><BR>
<A HREF="#idx1029">max_exponent</A><BR>
<A HREF="#idx1030">max_exponent10</A><BR>
<A HREF="#idx1031">min()</A><BR>
<A HREF="#idx1032">min_exponent</A><BR>
<A HREF="#idx1033">min_exponent10</A><BR>
<A HREF="#idx1034">quiet_NaN()</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx1035">radix</A><BR>
<A HREF="#idx1036">round_error()</A><BR>
<A HREF="#idx1037">round_style</A><BR>
<A HREF="#idx1038">signaling_NaN()</A><BR>
<A HREF="#idx1039">tinyness_before</A><BR>
<A HREF="#idx1040">traps</A><BR>
</TD></TR>
</TABLE></UL>

<A NAME="sec2"><H3>Summary</H3></A>
<P>A class template for representing information about arithmetic types.</P>
<A NAME="sec3"><H3>Synopsis</H3></A>

<PRE>#include &lt;limits&gt;

namespace std {
  template &lt;class T&gt;
  class numeric_limits;
}
</PRE>
<A NAME="sec4"><H3>Specializations</H3></A>

<UL><PRE>namespace std {
  template &lt;&gt; class numeric_limits&lt;float&gt;;
  template &lt;&gt; class numeric_limits&lt;double&gt;;
  template &lt;&gt; class numeric_limits&lt;long double&gt;;
  template &lt;&gt; class numeric_limits&lt;short&gt;;
  template &lt;&gt; class numeric_limits&lt;unsigned short&gt;;
  template &lt;&gt; class numeric_limits&lt;int&gt;;
  template &lt;&gt; class numeric_limits&lt;unsigned int&gt;;
  template &lt;&gt; class numeric_limits&lt;long&gt;;
  template &lt;&gt; class numeric_limits&lt;unsigned long&gt;;
  // extension: long long specializations
  template &lt;&gt; class numeric_limits&lt;long long&gt;;
  template &lt;&gt; class numeric_limits&lt;unsigned long long&gt;;
  template &lt;&gt; class numeric_limits&lt;char&gt;;
  template &lt;&gt; class numeric_limits&lt;wchar_t&gt;;
  template &lt;&gt; class numeric_limits&lt;unsigned char&gt;;
  template &lt;&gt; class numeric_limits&lt;signed char&gt;;
  template &lt;&gt; class numeric_limits&lt;bool&gt;;
}
</PRE></UL>
<A NAME="sec5"><H3>Description</H3></A>
<P>Members of class template <B><I>numeric_limits</I></B> provide information about the properties of the implementation's fundamental arithmetic types. Specializations of the template are included for each arithmetic type. The program may specialize the primary template on user-defined types.</P>
<P>This class encapsulates information that is contained in the <SAMP>&lt;climits&gt;</SAMP> and <SAMP>&lt;cfloat&gt;</SAMP> headers, and includes additional information that is not contained in any existing C or C++ header. </P>
<P>Not all of the information given by members is meaningful for all specializations of <B><I>numeric_limits</I></B>. Any value that is not meaningful for a particular type is set to <SAMP>0</SAMP> or <SAMP>false</SAMP>. </P>
<A NAME="sec6"><H3>Interface</H3></A>

<UL><PRE>namespace std {

  template &lt;class T&gt;
  class numeric_limits {

    public:

    // General -- meaningful for all specializations.
    static const bool is_specialized ;
    static T min () throw();
    static T max () throw();
    static const int radix ;
    static const int digits ;
    static const int digits10 ;
    static const bool is_signed ;
    static const bool is_integer ;
    static const bool is_exact ;
    static const bool traps ;
    static const bool is_modulo ;
    static const bool is_bounded ;

    // Floating point specific.
    static T epsilon () throw();
    static T round_error () throw();
    static const int min_exponent10 ;
    static const int max_exponent10 ;
    static const int min_exponent ;
    static const int max_exponent ;
    static const bool has_infinity ;
    static const bool has_quiet_NaN ;
    static const bool has_signaling_NaN ;
    static const bool is_iec559 ;
    static const float_denorm_style has_denorm ;
    static const bool has_denorm_loss;
    static const bool tinyness_before ;
    static const float_round_style round_style ;
    static T denorm_min () throw();
    static T infinity () throw();
    static T quiet_NaN () throw();
    static T signaling_NaN () throw();
  };

  enum float_round_style {
    round_indeterminate       = -1,
    round_toward_zero         =  0,
    round_to_nearest          =  1,
    round_toward_infinity     =  2,
    round_toward_neg_infinity =  3
  };
  enum float_denorm_style {
    denorm_indeterminate      = -1,
    denorm_absent             =  0,
    denorm_present            =  1
  };
}
</PRE></UL>
<A NAME="sec7"><H3>Member Fields and Functions</H3></A>

<A NAME="idx1011"></A><PRE>static T 
<B>denorm_min</B>() throw();</PRE>
<UL>
<P>Returns the minimum denormalized value. Meaningful for all floating point types. For types that do not allow denormalized values, this method must return the minimum normalized value.</P>
</UL>


<A NAME="idx1012"></A><PRE>static const int 
<B>digits</B>;</PRE>
<UL>
<P>The number of radix digits that can be represented without change.   For built-in integer types, <SAMP>digits</SAMP> is usually the number of non-sign bits in the representation. For floating point types, <SAMP>digits</SAMP> is the number of radix digits in the mantissa. This member is meaningful for all specializations that declare <SAMP>is_bounded</SAMP> to be <SAMP>true</SAMP>.</P>
</UL>


<A NAME="idx1013"></A><PRE>static const int 
<B>digits10</B>;</PRE>
<UL>
<P>The number of base 10 digits that can be represented without change.   This function is meaningful for all specializations that declare <SAMP>is_bounded</SAMP> to be <SAMP>true</SAMP>.</P>
</UL>


<A NAME="idx1014"></A><PRE>static T 
<B>epsilon</B>() throw();</PRE>
<UL>
<P>Returns the machine epsilon (the difference between <SAMP>1</SAMP> and the least value greater than <SAMP>1</SAMP> that is representable). This function is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1015"></A><PRE>static const float_denorm_style 
<B>has_denorm</B>;</PRE>
<UL>
<P>Returns <SAMP>denorm_present</SAMP> if the type allows denormalized values. Returns <SAMP>denorm_absent</SAMP> if the type does not allow denormalized values. Returns <SAMP>denorm_indeterminate</SAMP> if it is indeterminate at compile time whether the type allows denormalized values. It is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1016"></A><PRE>static const bool
<B>has_denorm_loss</B>; </PRE>
<UL>
<P>This field is <SAMP>true</SAMP> if a loss of accuracy can be attributed to denormalization. Meaningful for floating point types only.</P>
</UL>


<A NAME="idx1017"></A><PRE>static const bool 
<B>has_infinity</B>;</PRE>
<UL>
<P>This field is <SAMP>true</SAMP> if the type has a representation for positive infinity.   It is meaningful for floating point types only. This field must be <SAMP>true</SAMP> for any type claiming conformance to IEC 559.</P>
</UL>


<A NAME="idx1018"></A><PRE>static const bool 
<B>has_quiet_NaN</B>;</PRE>
<UL>
<P>This field is <SAMP>true</SAMP> if the type has a representation for a quiet (non-signaling) "Not a Number". It is meaningful for floating point types only and must be <SAMP>true</SAMP> for any type claiming conformance to IEC 559.</P>
</UL>


<A NAME="idx1019"></A><PRE>static const bool 
<B>has_signaling_NaN</B>;</PRE>
<UL>
<P>This field is <SAMP>true</SAMP> if the type has a representation for a signaling "Not a Number".   It is meaningful for floating point types only, and must be <SAMP>true</SAMP> for any type claiming conformance to IEC 559.</P>
</UL>


<A NAME="idx1020"></A><PRE>static T 
<B>infinity</B>() throw();</PRE>
<UL>
<P>Returns the representation of positive infinity, if available. This member function is meaningful for only those specializations that declare <SAMP>has_infinity</SAMP> to be <SAMP>true</SAMP>. Required for any type claiming conformance to IEC 559.</P>
</UL>


<A NAME="idx1021"></A><PRE>static const bool 
<B>is_bounded</B>;</PRE>
<UL>
<P>This field is <SAMP>true</SAMP> if the set of values representable by the type is finite. All built-in C types are bounded; this member would be <SAMP>false</SAMP> for arbitrary precision types.</P>
</UL>


<A NAME="idx1022"></A><PRE>static const bool 
<B>is_exact</B>;</PRE>
<UL>
<P>This static member field is <SAMP>true</SAMP> if the type uses an exact representation. All integer types are exact, but not vice versa. For example, rational and fixed-exponent representations are exact but not integer. This member is meaningful for all specializations.</P>
</UL>


<A NAME="idx1023"></A><PRE>static const bool 
<B>is_iec559</B>;</PRE>
<UL>
<P>This member is <SAMP>true</SAMP> if and only if the type adheres to the IEC 559 standard. It is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1024"></A><PRE>static const bool 
<B>is_integer</B>;</PRE>
<UL>
<P>This member is <SAMP>true</SAMP> if the type is integer. This member is meaningful for all specializations.</P>
</UL>


<A NAME="idx1025"></A><PRE>static const bool 
<B>is_modulo</B>;</PRE>
<UL>
<P>This field is <SAMP>true</SAMP> if the type is modulo. Generally, this is <SAMP>false</SAMP> for floating types, <SAMP>true</SAMP> for unsigned integers, and <SAMP>true</SAMP> for signed integers on most machines. A type is modulo if it is possible to add two positive numbers and have a result that wraps around to a third number, which is less.</P>
</UL>


<A NAME="idx1026"></A><PRE>static const bool 
<B>is_signed</B>;</PRE>
<UL>
<P>This member is <SAMP>true</SAMP> if the type is signed. This member is meaningful for all specializations.</P>
</UL>


<A NAME="idx1027"></A><PRE>static const bool 
<B>is_specialized</B>;</PRE>
<UL>
<P>Indicates whether <B><I>numeric_limits</I></B> has been specialized for type <SAMP>T</SAMP>. This flag must be <SAMP>true</SAMP> for all specializations of <B><I>numeric_limits</I></B>. For the default <B><I>numeric_limits</I></B> template, this flag must be <SAMP>false</SAMP>. </P>
</UL>


<A NAME="idx1028"></A><PRE>static T
<B>max</B>() throw();</PRE>
<UL>
<P>Returns the maximum finite value. This function is meaningful for all specializations for which <SAMP>is_bounded</SAMP> == <SAMP>true</SAMP>.</P>
</UL>


<A NAME="idx1029"></A><PRE>static const int 
<B>max_exponent</B>;</PRE>
<UL>
<P>The maximum positive integer such that the radix raised to the power one less than that integer is in range. This field is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1030"></A><PRE>static const int 
<B>max_exponent10</B>;</PRE>
<UL>
<P>The maximum positive integer such that 10 raised to that power is in range. This field is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1031"></A><PRE>static T 
<B>min</B>() throw(;</PRE>
<UL>
<P>Returns the minimum finite value. For floating point types with denormalization, <SAMP>min()</SAMP> must return the minimum normalized value. The minimum denormalized value is given by <SAMP>denorm_min()</SAMP>. This function is meaningful for all specializations for which <SAMP>is_bounded == true</SAMP>, or for which <SAMP>is_bounded == false &amp;&amp; is_signed == false</SAMP>.</P>
</UL>


<A NAME="idx1032"></A><PRE>static const int 
<B>min_exponent</B>;</PRE>
<UL>
<P>The minimum negative integer such that the radix raised to the power one less than that integer is in range. This field is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1033"></A><PRE>static const int 
<B>min_exponent10</B>;</PRE>
<UL>
<P>The minimum negative integer such that 10 raised to that power is in range. This field is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1034"></A><PRE>static T 
<B>quiet_NaN</B>() throw();</PRE>
<UL>
<P>Returns the representation of a quiet "Not a Number", if available.   This function is meaningful only for those specializations that declare <SAMP>has_quiet_NaN</SAMP> to be <SAMP>true</SAMP>. This field is required for any type claiming conformance to IEC 559.</P>
</UL>


<A NAME="idx1035"></A><PRE>static const int 
<B>radix</B>;</PRE>
<UL>
<P>For floating types, specifies the base or radix of the exponent representation (often 2). For integer types, this member must specify the base of the representation. This field is meaningful for all specializations.</P>
</UL>


<A NAME="idx1036"></A><PRE>static T 
<B>round_error</B>() throw();</PRE>
<UL>
<P>Returns the measure of the maximum rounding error. This function is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1037"></A><PRE>static const float_round_style 
<B>round_style</B>;</PRE>
<UL>
<P>The rounding style for the type. Specializations for integer types must return <SAMP>round_toward_zero</SAMP>. This is meaningful for all floating point types.</P>
</UL>


<A NAME="idx1038"></A><PRE>static T 
<B>signaling_NaN</B>() throw();</PRE>
<UL>
<P>Returns the representation of a signaling "Not a Number", if available. This function is meaningful for only those specializations that declare <SAMP>has_signaling_NaN</SAMP> to be <SAMP>true</SAMP>. This function must be meaningful for any type claiming conformance to IEC 559.</P>
</UL>


<A NAME="idx1039"></A><PRE>static const bool 
<B>tinyness_before</B>;</PRE>
<UL>
<P>This member is <SAMP>true</SAMP> if <SAMP>tinyness</SAMP> is detected before rounding. It is meaningful for floating point types only.</P>
</UL>


<A NAME="idx1040"></A><PRE>static const bool 
<B>traps</B>;</PRE>
<UL>
<P>This field is <SAMP>true</SAMP> if trapping is implemented for this type.   The <SAMP>traps</SAMP> field is meaningful for all specializations.</P>
</UL>

<A NAME="sec8"><H3>Warnings</H3></A>
<P>The specializations for <SAMP>wide</SAMP> <SAMP>chars</SAMP> and <SAMP>bool</SAMP> are only available if your compiler has implemented them as real types and not simulated them with typedefs. </P>
<A NAME="sec9"><H3>See Also</H3></A>
<P>IEEE Standard for Binary Floating-Point Arithmetic, 345 East 47th Street, New York, NY 10017</P>
<P>Language Independent Arithmetic (LIA-1)</P>
<A NAME="sec10"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 18.2.1</I></P>

<BR>
<HR>
<A HREF="numeric-h.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="numpunct.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>

<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
    _uacct = "UA-1775151-1";
    urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->

</BODY>
</HTML>
