]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/multiprecision/doc/html/boost_multiprecision/tut/limits/constants.html
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / multiprecision / doc / html / boost_multiprecision / tut / limits / constants.html
CommitLineData
7c673cae
FG
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4<title>std::numeric_limits&lt;&gt; constants</title>
5<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
7<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Boost.Multiprecision">
8<link rel="up" href="../limits.html" title="Numeric Limits">
9<link rel="prev" href="../limits.html" title="Numeric Limits">
10<link rel="next" href="functions.html" title="std::numeric_limits&lt;&gt; functions">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr>
14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
15<td align="center"><a href="../../../../../../../index.html">Home</a></td>
16<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="../limits.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../limits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h4 class="title">
27<a name="boost_multiprecision.tut.limits.constants"></a><a class="link" href="constants.html" title="std::numeric_limits&lt;&gt; constants">std::numeric_limits&lt;&gt;
28 constants</a>
29</h4></div></div></div>
30<h5>
31<a name="boost_multiprecision.tut.limits.constants.h0"></a>
32 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.is_specialized"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.is_specialized">is_specialized</a>
33 </h5>
34<p>
35 <code class="computeroutput"><span class="keyword">true</span></code> for all arithmetic types
36 (integer, floating and fixed-point) for which <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">numeric_limits</span></code>
37 is specialized.
38 </p>
39<p>
40 A typical test is
41 </p>
42<pre class="programlisting"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_specialized</span> <span class="special">==</span> <span class="keyword">false</span><span class="special">)</span>
43<span class="special">{</span>
44 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"type "</span> <span class="special">&lt;&lt;</span> <span class="keyword">typeid</span><span class="special">(</span><span class="identifier">T</span><span class="special">).</span><span class="identifier">name</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="string">" is not specialized for std::numeric_limits!"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
45<span class="comment">// ...</span>
46<span class="special">}</span>
47</pre>
48<p>
49 Typically <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_specialized</span></code>
50 is <code class="computeroutput"><span class="keyword">true</span></code> for all <code class="computeroutput"><span class="identifier">T</span></code> where the compile-time constant members
51 of <code class="computeroutput"><span class="identifier">numeric_limits</span></code> are indeed
52 known at compile time, and don't vary at runtime. For example floating-point
53 types with runtime-variable precision such as <code class="computeroutput"><span class="identifier">mpfr_float</span></code>
54 have no <code class="computeroutput"><span class="identifier">numeric_limits</span></code>
55 specialization as it would be impossible to define all the members at compile
56 time. In contrast the precision of a type such as <code class="computeroutput"><span class="identifier">mpfr_float_50</span></code>
57 is known at compile time, and so it <span class="emphasis"><em>does</em></span> have a <code class="computeroutput"><span class="identifier">numeric_limits</span></code> specialization.
58 </p>
59<p>
60 Note that not all the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span></code>
61 member constants and functions are meaningful for all user-defined types
62 (UDT), such as the decimal and binary multiprecision types provided here.
63 More information on this is given in the sections below.
64 </p>
65<h5>
66<a name="boost_multiprecision.tut.limits.constants.h1"></a>
67 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.infinity"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.infinity">infinity</a>
68 </h5>
69<p>
70 For floating-point types, &#8734; is defined wherever possible, but clearly infinity
71 is meaningless for __arbitrary_precision arithmetic backends, and there
72 is one floating-point type (GMP's <code class="computeroutput"><span class="identifier">mpf_t</span></code>,
73 see <a class="link" href="../floats/gmp_float.html" title="gmp_float">gmp_float</a>)
74 which has no notion of infinity or NaN at all.
75 </p>
76<p>
77 A typical test whether infinity is implemented is
78 </p>
79<pre class="programlisting"><span class="keyword">if</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">has_infinity</span><span class="special">)</span>
80<span class="special">{</span>
81 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">infinity</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
82<span class="special">}</span>
83</pre>
84<p>
85 and using tests like this is strongly recommended to improve portability.
86 </p>
87<p>
88 If the backend is switched to a type that does not support infinity then,
89 without checks like this, there will be trouble.
90 </p>
91<h5>
92<a name="boost_multiprecision.tut.limits.constants.h2"></a>
93 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.is_signed"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.is_signed">is_signed</a>
94 </h5>
95<p>
96 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_signed</span> <span class="special">==</span>
97 <span class="keyword">true</span></code> if the type <code class="computeroutput"><span class="identifier">T</span></code>
98 is signed.
99 </p>
100<p>
101 For built-in binary types, the sign is held in a single bit, but for other
102 types (cpp_dec_float and cpp_bin_float) it may be a separate storage element,
103 usually <code class="computeroutput"><span class="keyword">bool</span></code>.
104 </p>
105<h5>
106<a name="boost_multiprecision.tut.limits.constants.h3"></a>
107 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.is_exact"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.is_exact">is_exact</a>
108 </h5>
109<p>
110 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_exact</span> <span class="special">==</span>
111 <span class="keyword">true</span></code> if type T uses exact representations.
112 </p>
113<p>
114 This is defined as <code class="computeroutput"><span class="keyword">true</span></code> for
115 all integer types and <code class="computeroutput"><span class="keyword">false</span></code>
116 for floating-point types.
117 </p>
118<p>
119 <a href="http://stackoverflow.com/questions/14203654/stdnumeric-limitsis-exact-what-is-a-usable-definition" target="_top">A
120 usable definition</a> has been discussed.
121 </p>
122<p>
123 ISO/IEC 10967-1, Language independent arithmetic, noted by the C++ Standard
124 defines
125 </p>
126<pre class="programlisting"><span class="identifier">A</span> <span class="identifier">floating</span><span class="special">-</span><span class="identifier">point</span> <span class="identifier">type</span> <span class="identifier">F</span> <span class="identifier">shall</span> <span class="identifier">be</span> <span class="identifier">a</span> <span class="identifier">finite</span> <span class="identifier">subset</span> <span class="identifier">of</span> <span class="special">[</span><span class="identifier">real</span><span class="special">].</span>
127</pre>
128<p>
129 The important practical distinction is that all integers (up to <code class="computeroutput"><span class="identifier">max</span><span class="special">()</span></code>)
130 can be stored exactly.
131 </p>
132<p>
133 <a href="http://en.wikipedia.org/wiki/Rational_number" target="_top">Rational</a>
134 types using two integer types are also exact.
135 </p>
136<p>
137 Floating-point types <span class="bold"><strong>cannot store all real values</strong></span>
138 (those in the set of &#8476;) <span class="bold"><strong>exactly</strong></span>. For example,
139 0.5 can be stored exactly in a binary floating-point, but 0.1 cannot. What
140 is stored is the nearest representable real value, that is, rounded to
141 nearest.
142 </p>
143<p>
144 Fixed-point types (usually decimal) are also defined as exact, in that
145 they only store a <span class="bold"><strong>fixed precision</strong></span>, so
146 half cents or pennies (or less) cannot be stored. The results of computations
147 are rounded up or down, just like the result of integer division stored
148 as an integer result.
149 </p>
150<p>
151 There are number of proposals to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3407.html" target="_top">add
152 Decimal floating-point Support to C++</a>.
153 </p>
154<p>
155 <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2849.pdf" target="_top">Decimal
156 TR</a>.
157 </p>
158<p>
159 And also <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3352.html" target="_top">C++
160 Binary Fixed-Point Arithmetic</a>.
161 </p>
162<h5>
163<a name="boost_multiprecision.tut.limits.constants.h4"></a>
164 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.is_bounded"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.is_bounded">is_bounded</a>
165 </h5>
166<p>
167 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_bounded</span> <span class="special">==</span>
168 <span class="keyword">true</span></code> if the set of values represented
169 by the type <code class="computeroutput"><span class="identifier">T</span></code> is finite.
170 </p>
171<p>
172 This is <code class="computeroutput"><span class="keyword">true</span></code> for all built-in
173 integer, fixed and floating-point types, and most multi-precision types.
174 </p>
175<p>
176 It is only <code class="computeroutput"><span class="keyword">false</span></code> for a few
177 __arbitrary_precision types like <code class="computeroutput"><span class="identifier">cpp_int</span></code>.
178 </p>
179<p>
180 Rational and fixed-exponent representations are exact but not integer.
181 </p>
182<h5>
183<a name="boost_multiprecision.tut.limits.constants.h5"></a>
184 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.is_modulo"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.is_modulo">is_modulo</a>
185 </h5>
186<p>
187 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_modulo</span></code> is defined as <code class="computeroutput"><span class="keyword">true</span></code> if adding two positive values of type
188 T can yield a result less than either value.
189 </p>
190<p>
191 <code class="computeroutput"><span class="identifier">is_modulo</span> <span class="special">==</span>
192 <span class="keyword">true</span></code> means that the type does not
193 overflow, but, for example, 'wraps around' to zero, when adding one to
194 the <code class="computeroutput"><span class="identifier">max</span><span class="special">()</span></code>
195 value.
196 </p>
197<p>
198 For most built-in integer types, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;&gt;::</span><span class="identifier">is_modulo</span></code>
199 is <code class="computeroutput"><span class="keyword">true</span></code>.
200 </p>
201<p>
202 <code class="computeroutput"><span class="keyword">bool</span></code> is the only exception.
203 </p>
204<p>
205 The modulo behaviour is sometimes useful, but also can be unexpected, and
206 sometimes undesired, behaviour.
207 </p>
208<p>
209 Overflow of signed integers can be especially unexpected, possibly causing
210 change of sign.
211 </p>
212<p>
213 Boost.Multiprecision integer type <code class="computeroutput"><span class="identifier">cpp_int</span></code>
214 is not modulo because as an __arbitrary_precision types, it expands to
215 hold any value that the machine resources permit.
216 </p>
217<p>
218 However fixed precision <a class="link" href="../ints/cpp_int.html" title="cpp_int">cpp_int</a>'s
219 may be modulo if they are unchecked (i.e. they behave just like built in
220 integers), but not if they are checked (overflow causes an exception to
221 be raised).
222 </p>
223<p>
224 Built-in and multi-precision floating-point types are normally not modulo.
225 </p>
226<p>
227 Where possible, overflow is to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;&gt;::</span><span class="identifier">infinity</span><span class="special">()</span></code>, provided <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;&gt;::</span><span class="identifier">has_infinity</span>
228 <span class="special">==</span> <span class="keyword">true</span></code>.
229 </p>
230<h5>
231<a name="boost_multiprecision.tut.limits.constants.h6"></a>
232 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.radix"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.radix">radix</a>
233 </h5>
234<p>
235 Constant <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">radix</span></code> returns either 2 (for built-in
236 and binary types) or 10 (for decimal types).
237 </p>
238<h5>
239<a name="boost_multiprecision.tut.limits.constants.h7"></a>
240 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.digits"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.digits">digits</a>
241 </h5>
242<p>
243 The number of <code class="computeroutput"><span class="identifier">radix</span></code> digits
244 that be represented without change:
245 </p>
246<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
247<li class="listitem">
248 for integer types, the number of <span class="bold"><strong>non-sign bits</strong></span>
249 in the significand.
250 </li>
251<li class="listitem">
252 for floating types, the number of <span class="bold"><strong>radix digits</strong></span>
253 in the significand.
254 </li>
255</ul></div>
256<p>
257 The values include any implicit bit, so for example, for the ubiquious
258 <code class="computeroutput"><span class="keyword">double</span></code> using 64 bits (<a href="http://en.wikipedia.org/wiki/Double_precision_floating-point_format" target="_top">IEEE
259 binary64 </a>), <code class="computeroutput"><span class="identifier">digits</span></code>
260 == 53, even though there are only 52 actual bits of the significand stored
261 in the representation. The value of <code class="computeroutput"><span class="identifier">digits</span></code>
262 reflects the fact that there is one implicit bit which is always set to
263 1.
264 </p>
265<p>
266 The Boost.Multiprecision binary types do not use an implicit bit, so the
267 <code class="computeroutput"><span class="identifier">digits</span></code> member reflects
268 exactly how many bits of precision were requested:
269 </p>
270<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">number</span><span class="special">&lt;</span><span class="identifier">cpp_bin_float</span><span class="special">&lt;</span><span class="number">53</span><span class="special">,</span> <span class="identifier">digit_base_2</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">float64</span><span class="special">;</span>
271<span class="keyword">typedef</span> <span class="identifier">number</span><span class="special">&lt;</span><span class="identifier">cpp_bin_float</span><span class="special">&lt;</span><span class="number">113</span><span class="special">,</span> <span class="identifier">digit_base_2</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">float128</span><span class="special">;</span>
272<span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">float64</span><span class="special">&gt;::</span><span class="identifier">digits</span> <span class="special">==</span> <span class="number">53.</span>
273<span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">float128</span><span class="special">&gt;::</span><span class="identifier">digits</span> <span class="special">==</span> <span class="number">113.</span>
274</pre>
275<p>
276 For the most common case of <code class="computeroutput"><span class="identifier">radix</span>
277 <span class="special">==</span> <span class="number">2</span></code>,
278 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">digits</span></code> is the number of bits in the representation,
279 not counting any sign bit.
280 </p>
281<p>
282 For a decimal integer type, when <code class="computeroutput"><span class="identifier">radix</span>
283 <span class="special">==</span> <span class="number">10</span></code>,
284 it is the number of decimal digits.
285 </p>
286<h5>
287<a name="boost_multiprecision.tut.limits.constants.h8"></a>
288 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.digits10"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.digits10">digits10</a>
289 </h5>
290<p>
291 Constant <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">digits10</span></code> returns the number of decimal
292 digits that can be represented without change or loss.
293 </p>
294<p>
295 For example, <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">digits10</span></code> is 2.
296 </p>
297<p>
298 This somewhat inscrutable definition means that an <code class="computeroutput"><span class="keyword">unsigned</span>
299 <span class="keyword">char</span></code> can hold decimal values <code class="computeroutput"><span class="number">0.</span><span class="special">.</span><span class="number">99</span></code>
300 without loss of precision or accuracy, usually from truncation.
301 </p>
302<p>
303 Had the definition been 3 then that would imply it could hold 0..999, but
304 as we all know, an 8-bit <code class="computeroutput"><span class="keyword">unsigned</span>
305 <span class="keyword">char</span></code> can only hold 0..255, and an
306 attempt to store 256 or more will involve loss or change.
307 </p>
308<p>
309 For bounded integers, it is thus <span class="bold"><strong>one less</strong></span>
310 than number of decimal digits you need to display the biggest integer
311 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">()</span></code>.
312 This value can be used to predict the layout width required for
313 </p>
314<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span>
315 <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setw</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">short</span><span class="special">&gt;::</span><span class="identifier">digits10</span> <span class="special">+</span><span class="number">1</span> <span class="special">+</span><span class="number">1</span><span class="special">)</span> <span class="comment">// digits10+1, and +1 for sign.</span>
316 <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">showpos</span> <span class="special">&lt;&lt;</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">short</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">)()</span> <span class="comment">// +32767</span>
317 <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
318 <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setw</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">short</span><span class="special">&gt;::</span><span class="identifier">digits10</span> <span class="special">+</span><span class="number">1</span> <span class="special">+</span><span class="number">1</span><span class="special">)</span>
319 <span class="special">&lt;&lt;</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">short</span><span class="special">&gt;::</span><span class="identifier">min</span><span class="special">)()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// -32767</span>
320</pre>
321<p>
322 For example, <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">short</span></code>
323 is often stored in 16 bits, so the maximum value is 0xFFFF or 65535.
324 </p>
325<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span>
326 <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setw</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">&gt;::</span><span class="identifier">digits10</span> <span class="special">+</span><span class="number">1</span> <span class="special">+</span><span class="number">1</span><span class="special">)</span> <span class="comment">// digits10+1, and +1 for sign.</span>
327 <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">showpos</span> <span class="special">&lt;&lt;</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">)()</span> <span class="comment">// 65535</span>
328 <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
329 <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setw</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">&gt;::</span><span class="identifier">digits10</span> <span class="special">+</span><span class="number">1</span> <span class="special">+</span><span class="number">1</span><span class="special">)</span> <span class="comment">// digits10+1, and +1 for sign.</span>
330 <span class="special">&lt;&lt;</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">&gt;::</span><span class="identifier">min</span><span class="special">)()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0</span>
331</pre>
332<p>
333 For bounded floating-point types, if we create a <code class="computeroutput"><span class="keyword">double</span></code>
334 with a value with <code class="computeroutput"><span class="identifier">digits10</span></code>
335 (usually 15) decimal digits, <code class="computeroutput"><span class="number">1e15</span></code>
336 or <code class="computeroutput"><span class="number">1000000000000000</span></code> :
337 </p>
338<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span><span class="special">);</span>
339<span class="keyword">double</span> <span class="identifier">d</span> <span class="special">=</span> <span class="number">1e15</span><span class="special">;</span>
340<span class="keyword">double</span> <span class="identifier">dp1</span> <span class="special">=</span> <span class="identifier">d</span><span class="special">+</span><span class="number">1</span><span class="special">;</span>
341<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">d</span> <span class="special">&lt;&lt;</span> <span class="string">"\n"</span> <span class="special">&lt;&lt;</span> <span class="identifier">dp1</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
342<span class="comment">// 1000000000000000</span>
343<span class="comment">// 1000000000000001</span>
344<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">dp1</span> <span class="special">-</span> <span class="identifier">d</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 1</span>
345</pre>
346<p>
347 and we can increment this value to <code class="computeroutput"><span class="number">1000000000000001</span></code>
348 as expected and show the difference too.
349 </p>
350<p>
351 But if we try to repeat this with more than <code class="computeroutput"><span class="identifier">digits10</span></code>
352 digits,
353 </p>
354<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span><span class="special">);</span>
355<span class="keyword">double</span> <span class="identifier">d</span> <span class="special">=</span> <span class="number">1e16</span><span class="special">;</span>
356<span class="keyword">double</span> <span class="identifier">dp1</span> <span class="special">=</span> <span class="identifier">d</span><span class="special">+</span><span class="number">1</span><span class="special">;</span>
357<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">d</span> <span class="special">&lt;&lt;</span> <span class="string">"\n"</span> <span class="special">&lt;&lt;</span> <span class="identifier">dp1</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
358<span class="comment">// 10000000000000000</span>
359<span class="comment">// 10000000000000000</span>
360 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">dp1</span> <span class="special">-</span> <span class="identifier">d</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 0 !!!</span>
361</pre>
362<p>
363 then we find that when we add one it has no effect, and display show that
364 there is loss of precision. See <a href="http://en.wikipedia.org/wiki/Loss_of_significance" target="_top">Loss
365 of significance or cancellation error</a>.
366 </p>
367<p>
368 So <code class="computeroutput"><span class="identifier">digits10</span></code> is the number
369 of decimal digits <span class="bold"><strong>guaranteed</strong></span> to be correct.
370 </p>
371<p>
372 For example, 'round-tripping' for <code class="computeroutput"><span class="keyword">double</span></code>:
373 </p>
374<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
375<li class="listitem">
376 If a decimal string with at most <code class="computeroutput"><span class="identifier">digits10</span></code>(
377 == 15) significant decimal digits is converted to <code class="computeroutput"><span class="keyword">double</span></code>
378 and then converted back to the same number of significant decimal digits,
379 then the final string will match the original 15 decimal digit string.
380 </li>
381<li class="listitem">
382 If a <code class="computeroutput"><span class="keyword">double</span></code> floating-point
383 number is converted to a decimal string with at least 17 decimal digits
384 and then converted back to <code class="computeroutput"><span class="keyword">double</span></code>,
385 then the result will be binary identical to the original <code class="computeroutput"><span class="keyword">double</span></code> value.
386 </li>
387</ul></div>
388<p>
389 For most purposes, you will much more likely want <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;&gt;::</span><span class="identifier">max_digits10</span></code>,
390 the number of decimal digits that ensure that a change of one least significant
391 bit (ULP) produces a different decimal digits string.
392 </p>
393<p>
394 For the most common <code class="computeroutput"><span class="keyword">double</span></code>
395 floating-point type,<code class="computeroutput"><span class="identifier">max_digits10</span></code>
396 is <code class="computeroutput"><span class="identifier">digits10</span><span class="special">+</span><span class="number">2</span></code>, but you should use C++11 <code class="computeroutput"><span class="identifier">max_digits10</span></code> where possible (see <a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.max_digits10">below</a>).
397 </p>
398<h5>
399<a name="boost_multiprecision.tut.limits.constants.h9"></a>
400 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.max_digits10"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.max_digits10">max_digits10</a>
401 </h5>
402<p>
403 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span></code> was added for floating-point
404 because <code class="computeroutput"><span class="identifier">digits10</span></code> decimal
405 digits are insufficient to show a least significant bit (ULP) change giving
406 puzzling displays like
407 </p>
408<pre class="programlisting"><span class="number">0.666666666666667</span> <span class="special">!=</span> <span class="number">0.666666666666667</span>
409</pre>
410<p>
411 from failure to 'round-trip', for example:
412 </p>
413<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">write</span> <span class="special">=</span> <span class="number">2.</span><span class="special">/</span><span class="number">3</span><span class="special">;</span> <span class="comment">// Any arbitrary value that cannot be represented exactly.</span>
414<span class="keyword">double</span> <span class="identifier">read</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
415<span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span> <span class="identifier">s</span><span class="special">;</span>
416<span class="identifier">s</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">digits10</span><span class="special">);</span> <span class="comment">// or `float64_t` for 64-bit IEE754 double.</span>
417<span class="identifier">s</span> <span class="special">&lt;&lt;</span> <span class="identifier">write</span><span class="special">;</span>
418<span class="identifier">s</span> <span class="special">&gt;&gt;</span> <span class="identifier">read</span><span class="special">;</span>
419<span class="keyword">if</span><span class="special">(</span><span class="identifier">read</span> <span class="special">!=</span> <span class="identifier">write</span><span class="special">)</span>
420<span class="special">{</span>
421 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setprecision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">digits10</span><span class="special">)</span>
422 <span class="special">&lt;&lt;</span> <span class="identifier">read</span> <span class="special">&lt;&lt;</span> <span class="string">" != "</span> <span class="special">&lt;&lt;</span> <span class="identifier">write</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
423<span class="special">}</span>
424</pre>
425<p>
426 If you wish to ensure that a change of one least significant bit (ULP)
427 produces a different decimal digits string, then <code class="computeroutput"><span class="identifier">max_digits10</span></code>
428 is the precision to use.
429 </p>
430<p>
431 For example:
432 </p>
433<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">pi</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">double_constants</span><span class="special">::</span><span class="identifier">pi</span><span class="special">;</span>
434<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span><span class="special">);</span>
435<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">pi</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 3.1415926535897931</span>
436</pre>
437<p>
438 will display &#960; to the maximum possible precision using a <code class="computeroutput"><span class="keyword">double</span></code>.
439 </p>
440<p>
441 and similarly for a much higher precision type:
442 </p>
443<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">;</span>
444
445<span class="keyword">typedef</span> <span class="identifier">number</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float</span><span class="special">&lt;</span><span class="number">50</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">cpp_dec_float_50</span><span class="special">;</span> <span class="comment">// 50 decimal digits.</span>
446
447<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">cpp_dec_float_50</span><span class="special">;</span>
448
449<span class="identifier">cpp_dec_float_50</span> <span class="identifier">pi</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">constants</span><span class="special">::</span><span class="identifier">pi</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float_50</span><span class="special">&gt;();</span>
450<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float_50</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span><span class="special">);</span>
451<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">pi</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
452<span class="comment">// 3.141592653589793238462643383279502884197169399375105820974944592307816406</span>
453</pre>
454<p>
455 For integer types, <code class="computeroutput"><span class="identifier">max_digits10</span></code>
456 is implementation-dependent, but is usually <code class="computeroutput"><span class="identifier">digits10</span>
457 <span class="special">+</span> <span class="number">2</span></code>.
458 This is the output field-width required for the maximum value of the type
459 T <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">()</span></code>
460 <span class="emphasis"><em>including a sign and a space</em></span>.
461 </p>
462<p>
463 So this will produce neat columns.
464 </p>
465<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setw</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span><span class="special">)</span> <span class="special">...</span>
466</pre>
467<p>
468 The extra two or three least-significant digits are 'noisy' and may be
469 junk, but if you want to 'round-trip' - printing a value out as a decimal
470 digit string and reading it back in - (most commonly during serialization
471 and de-serialization) you must use <code class="computeroutput"><span class="identifier">os</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span><span class="special">)</span></code>.
472 </p>
473<div class="note"><table border="0" summary="Note">
474<tr>
475<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
476<th align="left">Note</th>
477</tr>
478<tr><td align="left" valign="top"><p>
479 For Microsoft Visual Studio 2010, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">float</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span></code>
480 is wrongly defined as 8. It should be 9.
481 </p></td></tr>
482</table></div>
483<div class="note"><table border="0" summary="Note">
484<tr>
485<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
486<th align="left">Note</th>
487</tr>
488<tr><td align="left" valign="top">
489<p>
490 For Microsoft Visual Studio before 2013, and default float format, a
491 small range of values approximately 0.0001 to 0.004, with exponent values
492 of 3F2 to 3F6, are wrongly input by one least significant bit, probably
493 every third value of significand.
494 </p>
495<p>
496 A workaround is using scientific or exponential format <code class="computeroutput"><span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">scientific</span></code>.
497 </p>
498</td></tr>
499</table></div>
500<div class="note"><table border="0" summary="Note">
501<tr>
502<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
503<th align="left">Note</th>
504</tr>
505<tr><td align="left" valign="top"><p>
506 BOOST_NO_CXX11_NUMERIC_LIMITS is a suitable feature-test macro to determine
507 if <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">float</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span></code> is implemented on any
508 platform.
509 </p></td></tr>
510</table></div>
511<p>
512 If <code class="computeroutput"><span class="identifier">max_digits10</span></code> is not
513 available, you should use the <a href="http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF" target="_top">Kahan
514 formula for floating-point type T</a>.
515 </p>
516<p>
517 In C++, the equations for what Kahan (on page 4) describes as 'at least'
518 and 'at most' are:
519 </p>
520<pre class="programlisting"><span class="keyword">static</span> <span class="keyword">long</span> <span class="keyword">double</span> <span class="keyword">const</span> <span class="identifier">log10Two</span> <span class="special">=</span> <span class="number">0.30102999566398119521373889472449L</span><span class="special">;</span> <span class="comment">// log10(2.)</span>
521
522<span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">floor</span><span class="special">((</span><span class="identifier">significand_digits</span> <span class="special">-</span> <span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">log10Two</span><span class="special">));</span> <span class="comment">// == digits10 - 'at least' .</span>
523<span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">ceil</span><span class="special">(</span><span class="number">1</span> <span class="special">+</span> <span class="identifier">significand_digits</span> <span class="special">*</span> <span class="identifier">log10Two</span><span class="special">));</span> <span class="comment">// == max_digits10 - 'at most'.</span>
524</pre>
525<p>
526 Unfortunately, these cannot be evaluated (at least by C++03) at <span class="bold"><strong>compile-time</strong></span>. So the following expression is often
527 used instead.
528 </p>
529<pre class="programlisting"><span class="identifier">max_digits10</span> <span class="special">=</span> <span class="number">2</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">digits</span> <span class="special">*</span> <span class="number">3010U</span><span class="special">/</span><span class="number">10000U</span><span class="special">;</span>
530
531<span class="comment">// == 2 + std::numeric_limits&lt;T&gt;::digits for double and 64-bit long double.</span>
532<span class="comment">// == 3 + std::numeric_limits&lt;T&gt;::digits for float, 80-bit long-double and __float128.</span>
533</pre>
534<p>
535 often the actual values are computed for the C limits macros:
536 </p>
537<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">FLT_MAXDIG10</span> <span class="special">(</span><span class="number">2</span><span class="special">+</span><span class="identifier">FLT_MANT_DIG</span> <span class="special">*</span> <span class="number">3010U</span><span class="special">/</span><span class="number">10000U</span><span class="special">)</span> <span class="comment">// 9</span>
538<span class="preprocessor">#define</span> <span class="identifier">DBL_MAXDIG10</span> <span class="special">(</span><span class="number">2</span><span class="special">+</span> <span class="special">(</span><span class="identifier">DBL_MANT_DIG</span> <span class="special">*</span> <span class="number">3010U</span><span class="special">)/</span><span class="number">10000U</span><span class="special">)</span> <span class="comment">// 17</span>
539<span class="preprocessor">#define</span> <span class="identifier">LDBL_MAXDIG10</span> <span class="special">(</span><span class="number">2</span><span class="special">+</span> <span class="special">(</span><span class="identifier">LDBL_MANT_DIG</span> <span class="special">*</span> <span class="number">3010U</span><span class="special">)/</span><span class="number">10000U</span><span class="special">)</span> <span class="comment">// 17 for MSVC, 18 for others.</span>
540</pre>
541<p>
542 The factor 3010U/10000U is <span class="emphasis"><em>log<sub>10</sub>(2) = 0.3010</em></span> that
543 can be evaluated at compile-time using only <code class="computeroutput"><span class="keyword">short</span>
544 <span class="keyword">unsigned</span> <span class="keyword">int</span></code>s
545 to be a desirable <code class="computeroutput"><span class="keyword">const</span></code> or
546 <code class="computeroutput"><span class="keyword">constexpr</span></code> (and usually also
547 <code class="computeroutput"><span class="keyword">static</span></code>).
548 </p>
549<p>
550 Boost macros allow this to be done portably, see <a href="http://www.boost.org/doc/libs/1_58_0/libs/config/doc/html/boost_config/boost_macro_reference.html" target="_top">BOOST_CONSTEXPR_OR_CONST
551 or BOOST_STATIC_CONSTEXPR</a>.
552 </p>
553<p>
554 (See also <a href="http://www.loria.fr/~zimmerma/mca/mca-cup-0.5.9.pdf" target="_top">Richard
555 P. Brent and Paul Zimmerman, Modern Computer Arithmetic</a> Equation
556 3.8 on page 116).
557 </p>
558<p>
559 For example, to be portable (including obselete platforms) for type <code class="computeroutput"><span class="identifier">T</span></code> where <code class="computeroutput"><span class="identifier">T</span></code>
560 may be: <code class="computeroutput"><span class="keyword">float</span></code>, <code class="computeroutput"><span class="keyword">double</span></code>, <code class="computeroutput"><span class="keyword">long</span>
561 <span class="keyword">double</span></code>, <code class="computeroutput"><span class="number">128</span><span class="special">-</span><span class="identifier">bit</span> <span class="identifier">quad</span> <span class="identifier">type</span></code>,
562 <code class="computeroutput"><span class="identifier">cpp_bin_float_50</span></code> ...
563 </p>
564<pre class="programlisting"> <span class="keyword">typedef</span> <span class="keyword">float</span> <span class="identifier">T</span><span class="special">;</span>
565
566<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_NO_CXX11_NUMERIC_LIMITS</span>
567 <span class="comment">// No max_digits10 implemented.</span>
568 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">max_digits10</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;());</span>
569<span class="preprocessor">#else</span>
570 <span class="preprocessor">#if</span><span class="special">(</span><span class="identifier">_MSC_VER</span> <span class="special">&lt;=</span> <span class="number">1600</span><span class="special">)</span>
571 <span class="comment">// Wrong value for std::numeric_limits&lt;float&gt;::max_digits10.</span>
572 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">max_digits10</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;());</span>
573 <span class="preprocessor">#else</span> <span class="comment">// Use the C++11 max_digits10.</span>
574 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span><span class="special">);</span>
575 <span class="preprocessor">#endif</span>
576<span class="preprocessor">#endif</span>
577
578 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"std::cout.precision(max_digits10) = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// 9</span>
579
580 <span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">1.2345678901234567889</span><span class="special">;</span>
581
582 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"x = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">//</span>
583</pre>
584<p>
585 which should output:
586 </p>
587<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">max_digits10</span><span class="special">)</span> <span class="special">=</span> <span class="number">9</span>
588<span class="identifier">x</span> <span class="special">=</span> <span class="number">1.23456789</span>
589</pre>
590<h5>
591<a name="boost_multiprecision.tut.limits.constants.h10"></a>
592 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.round_style"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.round_style">round_style</a>
593 </h5>
594<p>
595 The rounding style determines how the result of floating-point operations
596 is treated when the result cannot be <span class="bold"><strong>exactly represented</strong></span>
597 in the significand. Various rounding modes may be provided:
598 </p>
599<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
600<li class="listitem">
601 round to nearest up or down (default for floating-point types).
602 </li>
603<li class="listitem">
604 round up (toward positive infinity).
605 </li>
606<li class="listitem">
607 round down (toward negative infinity).
608 </li>
609<li class="listitem">
610 round toward zero (integer types).
611 </li>
612<li class="listitem">
613 no rounding (if decimal radix).
614 </li>
615<li class="listitem">
616 rounding mode is not determinable.
617 </li>
618</ul></div>
619<p>
620 For integer types, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">round_style</span></code>
621 is always towards zero, so
622 </p>
623<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">round_style</span> <span class="special">==</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">round_to_zero</span><span class="special">;</span>
624</pre>
625<p>
626 A decimal type, <code class="computeroutput"><span class="identifier">cpp_dec_float</span></code>
627 rounds in no particular direction, which is to say it doesn't round at
628 all. And since there are several guard digits, it's not really the same
629 as truncation (round toward zero) either.
630 </p>
631<p>
632 For floating-point types, it is normal to round to nearest.
633 </p>
634<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">round_style</span> <span class="special">==</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">round_to_nearest</span><span class="special">;</span>
635</pre>
636<p>
637 See function <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">round_error</span></code> for the maximum error (in
638 ULP) that rounding can cause.
639 </p>
640<h5>
641<a name="boost_multiprecision.tut.limits.constants.h11"></a>
642 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.has_denorm_loss"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.has_denorm_loss">has_denorm_loss</a>
643 </h5>
644<p>
645 <code class="computeroutput"><span class="keyword">true</span></code> if a loss of precision
646 is detected as a <a href="http://en.wikipedia.org/wiki/Denormalization" target="_top">denormalization</a>
647 loss, rather than an inexact result.
648 </p>
649<p>
650 Always <code class="computeroutput"><span class="keyword">false</span></code> for integer types.
651 </p>
652<p>
653 <code class="computeroutput"><span class="keyword">false</span></code> for all types which
654 do not have <code class="computeroutput"><span class="identifier">has_denorm</span></code>
655 == <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">denorm_present</span></code>.
656 </p>
657<h5>
658<a name="boost_multiprecision.tut.limits.constants.h12"></a>
659 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.denorm_style"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.denorm_style">denorm_style</a>
660 </h5>
661<p>
662 <a href="http://en.wikipedia.org/wiki/Denormal_number" target="_top">Denormalized
663 values</a> are representations with a variable number of exponent bits
664 that can permit gradual underflow, so that, if type T is <code class="computeroutput"><span class="keyword">double</span></code>.
665 </p>
666<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">denorm_min</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">min</span><span class="special">()</span>
667</pre>
668<p>
669 A type may have any of the following <code class="computeroutput"><span class="keyword">enum</span>
670 <span class="identifier">float_denorm_style</span></code> values:
671 </p>
672<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
673<li class="listitem">
674 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">denorm_absent</span></code>, if it does not allow
675 denormalized values. (Always used for all integer and exact types).
676 </li>
677<li class="listitem">
678 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">denorm_present</span></code>, if the floating-point
679 type allows denormalized values.
680 </li>
681<li class="listitem">
682 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">denorm_indeterminate</span></code>, if indeterminate
683 at compile time.
684 </li>
685</ul></div>
686<h5>
687<a name="boost_multiprecision.tut.limits.constants.h13"></a>
688 <span class="phrase"><a name="boost_multiprecision.tut.limits.constants.tinyness_before_rounding"></a></span><a class="link" href="constants.html#boost_multiprecision.tut.limits.constants.tinyness_before_rounding">Tinyness
689 before rounding</a>
690 </h5>
691<p>
692 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">tinyness_before</span></code>
693 </p>
694<p>
695 <code class="computeroutput"><span class="keyword">true</span></code> if a type can determine
696 that a value is too small to be represent as a normalized value before
697 rounding it.
698 </p>
699<p>
700 Generally true for <code class="computeroutput"><span class="identifier">is_iec559</span></code>
701 floating-point built-in types, but false for integer types.
702 </p>
703<p>
704 Standard-compliant IEEE 754 floating-point implementations may detect the
705 floating-point underflow at three predefined moments:
706 </p>
707<div class="orderedlist"><ol class="orderedlist" type="1">
708<li class="listitem">
709 After computation of a result with absolute value smaller than <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">min</span><span class="special">()</span></code>,
710 such implementation detects <span class="emphasis"><em>tinyness before rounding</em></span>
711 (e.g. UltraSparc).
712 </li>
713<li class="listitem">
714 After rounding of the result to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">digits</span></code>
715 bits, if the result is tiny, such implementation detects <span class="emphasis"><em>tinyness
716 after rounding</em></span> (e.g. SuperSparc).
717 </li>
718<li class="listitem">
719 If the conversion of the rounded tiny result to subnormal form resulted
720 in the loss of precision, such implementation detects <span class="emphasis"><em>denorm
721 loss</em></span>.
722 </li>
723</ol></div>
724</div>
725<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
726<td align="left"></td>
727<td align="right"><div class="copyright-footer">Copyright &#169; 2002-2013 John Maddock and Christopher Kormanyos<p>
728 Distributed under the Boost Software License, Version 1.0. (See accompanying
729 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
730 </p>
731</div></td>
732</tr></table>
733<hr>
734<div class="spirit-nav">
735<a accesskey="p" href="../limits.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../limits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
736</div>
737</body>
738</html>