]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | <html> |
2 | <head> | |
3 | <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> | |
4 | <title>cpp_int</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 1. Boost.Multiprecision"> | |
8 | <link rel="up" href="../ints.html" title="Integer Types"> | |
9 | <link rel="prev" href="../ints.html" title="Integer Types"> | |
10 | <link rel="next" href="gmp_int.html" title="gmp_int"> | |
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="../ints.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../ints.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="gmp_int.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.ints.cpp_int"></a><a class="link" href="cpp_int.html" title="cpp_int">cpp_int</a> | |
28 | </h4></div></div></div> | |
29 | <p> | |
30 | <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">multiprecision</span><span class="special">/</span><span class="identifier">cpp_int</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> | |
31 | </p> | |
32 | <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">multiprecision</span><span class="special">{</span> | |
33 | ||
34 | <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">limb_type</span><span class="special">;</span> | |
35 | ||
36 | <span class="keyword">enum</span> <span class="identifier">cpp_integer_type</span> <span class="special">{</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span> <span class="special">};</span> | |
37 | <span class="keyword">enum</span> <span class="identifier">cpp_int_check_type</span> <span class="special">{</span> <span class="identifier">checked</span><span class="special">,</span> <span class="identifier">unchecked</span> <span class="special">};</span> | |
38 | ||
39 | <span class="keyword">template</span> <span class="special"><</span><span class="keyword">unsigned</span> <span class="identifier">MinBits</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span> | |
40 | <span class="keyword">unsigned</span> <span class="identifier">MaxBits</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span> | |
41 | <span class="identifier">cpp_integer_type</span> <span class="identifier">SignType</span> <span class="special">=</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> | |
42 | <span class="identifier">cpp_int_check_type</span> <span class="identifier">Checked</span> <span class="special">=</span> <span class="identifier">unchecked</span><span class="special">,</span> | |
43 | <span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special"><</span><span class="identifier">limb_type</span><span class="special">></span> <span class="special">></span> | |
44 | <span class="keyword">class</span> <span class="identifier">cpp_int_backend</span><span class="special">;</span> | |
45 | <span class="comment">//</span> | |
46 | <span class="comment">// Expression templates default to et_off if there is no allocator:</span> | |
47 | <span class="comment">//</span> | |
48 | <span class="keyword">template</span> <span class="special"><</span><span class="keyword">unsigned</span> <span class="identifier">MinBits</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">MaxBits</span><span class="special">,</span> <span class="identifier">cpp_integer_type</span> <span class="identifier">SignType</span><span class="special">,</span> <span class="identifier">cpp_int_check_type</span> <span class="identifier">Checked</span><span class="special">></span> | |
49 | <span class="keyword">struct</span> <span class="identifier">expression_template_default</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="identifier">MinBits</span><span class="special">,</span> <span class="identifier">MaxBits</span><span class="special">,</span> <span class="identifier">SignType</span><span class="special">,</span> <span class="identifier">Checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> | |
50 | <span class="special">{</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">expression_template_option</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">et_off</span><span class="special">;</span> <span class="special">};</span> | |
51 | ||
52 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><></span> <span class="special">></span> <span class="identifier">cpp_int</span><span class="special">;</span> <span class="comment">// arbitrary precision integer</span> | |
53 | <span class="keyword">typedef</span> <span class="identifier">rational_adaptor</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><></span> <span class="special">></span> <span class="identifier">cpp_rational_backend</span><span class="special">;</span> | |
54 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_rational_backend</span><span class="special">></span> <span class="identifier">cpp_rational</span><span class="special">;</span> <span class="comment">// arbitrary precision rational number</span> | |
55 | ||
56 | <span class="comment">// Fixed precision unsigned types:</span> | |
57 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">128</span><span class="special">,</span> <span class="number">128</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span><span class="special">,</span> <span class="identifier">unchecked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">uint128_t</span><span class="special">;</span> | |
58 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">256</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span><span class="special">,</span> <span class="identifier">unchecked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">uint256_t</span><span class="special">;</span> | |
59 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">512</span><span class="special">,</span> <span class="number">512</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span><span class="special">,</span> <span class="identifier">unchecked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">uint512_t</span><span class="special">;</span> | |
60 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">1024</span><span class="special">,</span> <span class="number">1024</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span><span class="special">,</span> <span class="identifier">unchecked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">uint1024_t</span><span class="special">;</span> | |
61 | ||
62 | <span class="comment">// Fixed precision signed types:</span> | |
63 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">128</span><span class="special">,</span> <span class="number">128</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">unchecked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">int128_t</span><span class="special">;</span> | |
64 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">256</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">unchecked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">int256_t</span><span class="special">;</span> | |
65 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">512</span><span class="special">,</span> <span class="number">512</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">unchecked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">int512_t</span><span class="special">;</span> | |
66 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">1024</span><span class="special">,</span> <span class="number">1024</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">unchecked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">int1024_t</span><span class="special">;</span> | |
67 | ||
68 | <span class="comment">// Over again, but with checking enabled this time:</span> | |
69 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_cpp_int</span><span class="special">;</span> | |
70 | <span class="keyword">typedef</span> <span class="identifier">rational_adaptor</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_cpp_rational_backend</span><span class="special">;</span> | |
71 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_rational_backend</span><span class="special">></span> <span class="identifier">checked_cpp_rational</span><span class="special">;</span> | |
72 | ||
73 | <span class="comment">// Checked fixed precision unsigned types:</span> | |
74 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">128</span><span class="special">,</span> <span class="number">128</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_uint128_t</span><span class="special">;</span> | |
75 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">256</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_uint256_t</span><span class="special">;</span> | |
76 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">512</span><span class="special">,</span> <span class="number">512</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_uint512_t</span><span class="special">;</span> | |
77 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">1024</span><span class="special">,</span> <span class="number">1024</span><span class="special">,</span> <span class="identifier">unsigned_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_uint1024_t</span><span class="special">;</span> | |
78 | ||
79 | <span class="comment">// Fixed precision signed types:</span> | |
80 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">128</span><span class="special">,</span> <span class="number">128</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_int128_t</span><span class="special">;</span> | |
81 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">256</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_int256_t</span><span class="special">;</span> | |
82 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">512</span><span class="special">,</span> <span class="number">512</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_int512_t</span><span class="special">;</span> | |
83 | <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special"><</span><span class="identifier">cpp_int_backend</span><span class="special"><</span><span class="number">1024</span><span class="special">,</span> <span class="number">1024</span><span class="special">,</span> <span class="identifier">signed_magnitude</span><span class="special">,</span> <span class="identifier">checked</span><span class="special">,</span> <span class="keyword">void</span><span class="special">></span> <span class="special">></span> <span class="identifier">checked_int1024_t</span><span class="special">;</span> | |
84 | ||
85 | <span class="special">}}</span> <span class="comment">// namespaces</span> | |
86 | </pre> | |
87 | <p> | |
88 | The <code class="computeroutput"><span class="identifier">cpp_int_backend</span></code> type | |
89 | is normally used via one of the convenience typedefs given above. | |
90 | </p> | |
91 | <p> | |
92 | This back-end is the "Swiss Army Knife" of integer types as it | |
93 | can represent both fixed and <a href="http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic" target="_top">arbitrary | |
94 | precision</a> integer types, and both signed and unsigned types. There | |
95 | are five template arguments: | |
96 | </p> | |
97 | <div class="variablelist"> | |
98 | <p class="title"><b></b></p> | |
99 | <dl class="variablelist"> | |
100 | <dt><span class="term">MinBits</span></dt> | |
101 | <dd><p> | |
102 | Determines the number of Bits to store directly within the object | |
103 | before resorting to dynamic memory allocation. When zero, this field | |
104 | is determined automatically based on how many bits can be stored | |
105 | in union with the dynamic storage header: setting a larger value | |
106 | may improve performance as larger integer values will be stored internally | |
107 | before memory allocation is required. | |
108 | </p></dd> | |
109 | <dt><span class="term">MaxBits</span></dt> | |
110 | <dd><p> | |
111 | Determines the maximum number of bits to be stored in the type: resulting | |
112 | in a fixed precision type. When this value is the same as MinBits, | |
113 | then the Allocator parameter is ignored, as no dynamic memory allocation | |
114 | will ever be performed: in this situation the Allocator parameter | |
115 | should be set to type <code class="computeroutput"><span class="keyword">void</span></code>. | |
116 | Note that this parameter should not be used simply to prevent large | |
117 | memory allocations, not only is that role better performed by the | |
118 | allocator, but fixed precision integers have a tendency to allocate | |
119 | all of MaxBits of storage more often than one would expect. | |
120 | </p></dd> | |
121 | <dt><span class="term">SignType</span></dt> | |
122 | <dd><p> | |
123 | Determines whether the resulting type is signed or not. Note that | |
124 | for <a href="http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic" target="_top">arbitrary | |
125 | precision</a> types this parameter must be <code class="computeroutput"><span class="identifier">signed_magnitude</span></code>. | |
126 | For fixed precision types then this type may be either <code class="computeroutput"><span class="identifier">signed_magnitude</span></code> or <code class="computeroutput"><span class="identifier">unsigned_magnitude</span></code>. | |
127 | </p></dd> | |
128 | <dt><span class="term">Checked</span></dt> | |
129 | <dd><p> | |
130 | This parameter has two values: <code class="computeroutput"><span class="identifier">checked</span></code> | |
131 | or <code class="computeroutput"><span class="identifier">unchecked</span></code>. See | |
132 | below. | |
133 | </p></dd> | |
134 | <dt><span class="term">Allocator</span></dt> | |
135 | <dd><p> | |
136 | The allocator to use for dynamic memory allocation, or type <code class="computeroutput"><span class="keyword">void</span></code> if MaxBits == MinBits. | |
137 | </p></dd> | |
138 | </dl> | |
139 | </div> | |
140 | <p> | |
141 | When the template parameter Checked is set to <code class="computeroutput"><span class="identifier">checked</span></code> | |
142 | then the result is a <span class="emphasis"><em>checked-integer</em></span>, checked and | |
143 | unchecked integers have the following properties: | |
144 | </p> | |
145 | <div class="informaltable"><table class="table"> | |
146 | <colgroup> | |
147 | <col> | |
148 | <col> | |
149 | <col> | |
150 | </colgroup> | |
151 | <thead><tr> | |
152 | <th> | |
153 | <p> | |
154 | Condition | |
155 | </p> | |
156 | </th> | |
157 | <th> | |
158 | <p> | |
159 | Checked-Integer | |
160 | </p> | |
161 | </th> | |
162 | <th> | |
163 | <p> | |
164 | Unchecked-Integer | |
165 | </p> | |
166 | </th> | |
167 | </tr></thead> | |
168 | <tbody> | |
169 | <tr> | |
170 | <td> | |
171 | <p> | |
172 | Numeric overflow in fixed precision arithmetic | |
173 | </p> | |
174 | </td> | |
175 | <td> | |
176 | <p> | |
177 | Throws a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">overflow_error</span></code>. | |
178 | </p> | |
179 | </td> | |
180 | <td> | |
181 | <p> | |
182 | Performs arithmetic modulo 2<sup>MaxBits</sup> | |
183 | </p> | |
184 | </td> | |
185 | </tr> | |
186 | <tr> | |
187 | <td> | |
188 | <p> | |
189 | Constructing an integer from a value that can not be represented | |
190 | in the target type | |
191 | </p> | |
192 | </td> | |
193 | <td> | |
194 | <p> | |
195 | Throws a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">range_error</span></code>. | |
196 | </p> | |
197 | </td> | |
198 | <td> | |
199 | <p> | |
200 | Converts the value modulo 2<sup>MaxBits</sup>, signed to unsigned conversions | |
201 | extract the last MaxBits bits of the 2's complement representation | |
202 | of the input value. | |
203 | </p> | |
204 | </td> | |
205 | </tr> | |
206 | <tr> | |
207 | <td> | |
208 | <p> | |
209 | Unsigned subtraction yielding a negative value. | |
210 | </p> | |
211 | </td> | |
212 | <td> | |
213 | <p> | |
214 | Throws a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">range_error</span></code>. | |
215 | </p> | |
216 | </td> | |
217 | <td> | |
218 | <p> | |
219 | Yields the value that would result from treating the unsigned | |
220 | type as a 2's complement signed type. | |
221 | </p> | |
222 | </td> | |
223 | </tr> | |
224 | <tr> | |
225 | <td> | |
226 | <p> | |
227 | Attempting a bitwise operation on a negative value. | |
228 | </p> | |
229 | </td> | |
230 | <td> | |
231 | <p> | |
232 | Throws a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">range_error</span></code> | |
233 | </p> | |
234 | </td> | |
235 | <td> | |
236 | <p> | |
237 | Yields the value, but not the bit pattern, that would result | |
238 | from performing the operation on a 2's complement integer type. | |
239 | </p> | |
240 | </td> | |
241 | </tr> | |
242 | </tbody> | |
243 | </table></div> | |
244 | <p> | |
245 | Things you should know when using this type: | |
246 | </p> | |
247 | <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> | |
248 | <li class="listitem"> | |
249 | Default constructed <code class="computeroutput"><span class="identifier">cpp_int_backend</span></code>s | |
250 | have the value zero. | |
251 | </li> | |
252 | <li class="listitem"> | |
253 | Division by zero results in a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">overflow_error</span></code> | |
254 | being thrown. | |
255 | </li> | |
256 | <li class="listitem"> | |
257 | Construction from a string that contains invalid non-numeric characters | |
258 | results in a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span></code> being thrown. | |
259 | </li> | |
260 | <li class="listitem"> | |
261 | Since the precision of <code class="computeroutput"><span class="identifier">cpp_int_backend</span></code> | |
262 | is necessarily limited when the allocator parameter is void, care should | |
263 | be taken to avoid numeric overflow when using this type unless you | |
264 | actually want modulo-arithmetic behavior. | |
265 | </li> | |
266 | <li class="listitem"> | |
267 | The type uses a sign-magnitude representation internally, so type | |
268 | <code class="computeroutput"><span class="identifier">int128_t</span></code> has 128-bits | |
269 | of precision plus an extra sign bit. In this respect the behaviour | |
270 | of these types differs from built-in 2's complement types. In might | |
271 | be tempting to use a 127-bit type instead, and indeed this does work, | |
272 | but behaviour is still slightly different from a 2's complement built-in | |
273 | type as the min and max values are identical (apart from the sign), | |
274 | where as they differ by one for a true 2's complement type. That said | |
275 | it should be noted that there's no requirement for built-in types to | |
276 | be 2's complement either - it's simply that this is the most common | |
277 | format by far. | |
278 | </li> | |
279 | <li class="listitem"> | |
280 | Attempting to print negative values as either an Octal or Hexadecimal | |
281 | string results in a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span></code> | |
282 | being thrown, this is a direct consequence of the sign-magnitude representation. | |
283 | </li> | |
284 | <li class="listitem"> | |
285 | The fixed precision types <code class="computeroutput"><span class="special">[</span><span class="identifier">checked_</span><span class="special">][</span><span class="identifier">u</span><span class="special">]</span><span class="identifier">intXXX_t</span></code> have expression template | |
286 | support turned off - it seems to make little difference to the performance | |
287 | of these types either way - so we may as well have the faster compile | |
288 | times by turning the feature off. | |
289 | </li> | |
290 | <li class="listitem"> | |
291 | Unsigned types support subtraction - the result is "as if" | |
292 | a 2's complement operation had been performed as long as they are not | |
293 | <span class="emphasis"><em>checked-integers</em></span> (see above). In other words they | |
294 | behave pretty much as a built in integer type would in this situation. | |
295 | So for example if we were using <code class="computeroutput"><span class="identifier">uint128_t</span></code> | |
296 | then <code class="computeroutput"><span class="identifier">uint128_t</span><span class="special">(</span><span class="number">1</span><span class="special">)-</span><span class="number">4</span></code> | |
297 | would result in the value <code class="computeroutput"><span class="number">0</span><span class="identifier">xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD</span></code> | |
298 | of type <code class="computeroutput"><span class="identifier">uint128_t</span></code>. | |
299 | However, had this operation been performed on <code class="computeroutput"><span class="identifier">checked_uint128_t</span></code> | |
300 | then a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">range_error</span></code> would have been thrown. | |
301 | </li> | |
302 | <li class="listitem"> | |
303 | Unary negation of unsigned types results in a compiler error (static | |
304 | assertion). | |
305 | </li> | |
306 | <li class="listitem"> | |
307 | This backend supports rvalue-references and is move-aware, making instantiations | |
308 | of <code class="computeroutput"><span class="identifier">number</span></code> on this backend | |
309 | move aware. | |
310 | </li> | |
311 | <li class="listitem"> | |
312 | When used at fixed precision, the size of this type is always one machine | |
313 | word larger than you would expect for an N-bit integer: the extra word | |
314 | stores both the sign, and how many machine words in the integer are | |
315 | actually in use. The latter is an optimisation for larger fixed precision | |
316 | integers, so that a 1024-bit integer has almost the same performance | |
317 | characteristics as a 128-bit integer, rather than being 4 times slower | |
318 | for addition and 16 times slower for multiplication (assuming the values | |
319 | involved would always fit in 128 bits). Typically this means you can | |
320 | use an integer type wide enough for the "worst case scenario" | |
321 | with only minor performance degradation even if most of the time the | |
322 | arithmetic could in fact be done with a narrower type. | |
323 | </li> | |
324 | <li class="listitem"> | |
325 | When used at fixed precision and MaxBits is smaller than the number | |
326 | of bits in the largest native integer type, then internally <code class="computeroutput"><span class="identifier">cpp_int_backend</span></code> switches to a "trivial" | |
327 | implementation where it is just a thin wrapper around a single integer. | |
328 | Note that it will still be slightly slower than a bare native integer, | |
329 | as it emulates a signed-magnitude representation rather than simply | |
330 | using the platforms native sign representation: this ensures there | |
331 | is no step change in behavior as a cpp_int grows in size. | |
332 | </li> | |
333 | <li class="listitem"> | |
334 | Fixed precision <code class="computeroutput"><span class="identifier">cpp_int</span></code>'s | |
335 | have some support for <code class="computeroutput"><span class="keyword">constexpr</span></code> | |
336 | values and user-defined literals, see <a class="link" href="../lits.html" title="Literal Types and constexpr Support">here</a> | |
337 | for the full description. For example <code class="computeroutput"><span class="number">0xfffff</span><span class="identifier">_cppi1024</span></code> specifies a 1024-bit integer | |
338 | with the value 0xffff. This can be used to generate compile time constants | |
339 | that are too large to fit into any built in number type. | |
340 | </li> | |
341 | <li class="listitem"> | |
342 | You can import/export the raw bits of a <a class="link" href="cpp_int.html" title="cpp_int">cpp_int</a> | |
343 | to and from external storage via the <code class="computeroutput"><span class="identifier">import_bits</span></code> | |
344 | and <code class="computeroutput"><span class="identifier">export_bits</span></code> functions. | |
345 | More information is in the <a class="link" href="../import_export.html" title="Importing and Exporting Data to and from cpp_int and cpp_bin_float">section | |
346 | on import/export</a>. | |
347 | </li> | |
348 | </ul></div> | |
349 | <h6> | |
350 | <a name="boost_multiprecision.tut.ints.cpp_int.h0"></a> | |
351 | <span class="phrase"><a name="boost_multiprecision.tut.ints.cpp_int.example"></a></span><a class="link" href="cpp_int.html#boost_multiprecision.tut.ints.cpp_int.example">Example:</a> | |
352 | </h6> | |
353 | <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">multiprecision</span><span class="special">/</span><span class="identifier">cpp_int</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> | |
354 | <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> | |
355 | ||
356 | <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> | |
357 | <span class="special">{</span> | |
358 | <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> | |
359 | ||
360 | <span class="identifier">int128_t</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> | |
361 | ||
362 | <span class="comment">// Do some fixed precision arithmetic:</span> | |
363 | <span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><=</span> <span class="number">20</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> | |
364 | <span class="identifier">v</span> <span class="special">*=</span> <span class="identifier">i</span><span class="special">;</span> | |
365 | ||
366 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">v</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints 20!</span> | |
367 | ||
368 | <span class="comment">// Repeat at arbitrary precision:</span> | |
369 | <span class="identifier">cpp_int</span> <span class="identifier">u</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> | |
370 | <span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><=</span> <span class="number">100</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> | |
371 | <span class="identifier">u</span> <span class="special">*=</span> <span class="identifier">i</span><span class="special">;</span> | |
372 | ||
373 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">u</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints 100!</span> | |
374 | ||
375 | <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> | |
376 | <span class="special">}</span> | |
377 | </pre> | |
378 | </div> | |
379 | <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> | |
380 | <td align="left"></td> | |
381 | <td align="right"><div class="copyright-footer">Copyright © 2002-2013 John Maddock and Christopher Kormanyos<p> | |
382 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
383 | 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>) | |
384 | </p> | |
385 | </div></td> | |
386 | </tr></table> | |
387 | <hr> | |
388 | <div class="spirit-nav"> | |
389 | <a accesskey="p" href="../ints.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../ints.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="gmp_int.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> | |
390 | </div> | |
391 | </body> | |
392 | </html> |