interval.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>interval&lt;R&gt;</title>
  5. <link rel="stylesheet" href="boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="index.html" title="Safe Numerics">
  8. <link rel="up" href="library_implementation.html" title="Library Implementation">
  9. <link rel="prev" href="checked_arithmetic.html" title="Checked Arithmetic">
  10. <link rel="next" href="checked_integer_arithmetic.html" title="safe_compare&lt;T, U&gt;">
  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 href="index.html" height="164px" src="pre-boost.jpg" alt="Library Documentation Index"></td>
  15. <td><h2>Safe Numerics</h2></td>
  16. </tr></table>
  17. <div class="spirit-nav">
  18. <a accesskey="p" href="checked_arithmetic.html"><img src="images/prev.png" alt="Prev"></a><a accesskey="u" href="library_implementation.html"><img src="images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home"></a><a accesskey="n" href="checked_integer_arithmetic.html"><img src="images/next.png" alt="Next"></a>
  19. </div>
  20. <div class="section">
  21. <div class="titlepage"><div><div><h3 class="title">
  22. <a name="safe_numerics.interval"></a>interval&lt;R&gt;</h3></div></div></div>
  23. <div class="toc"><dl class="toc">
  24. <dt><span class="section"><a href="interval.html#idm130202132352">Description</a></span></dt>
  25. <dt><span class="section"><a href="interval.html#idm130202129408">Template Parameters</a></span></dt>
  26. <dt><span class="section"><a href="interval.html#idm130202126048">Notation</a></span></dt>
  27. <dt><span class="section"><a href="interval.html#idm130202108592">Associated Types</a></span></dt>
  28. <dt><span class="section"><a href="interval.html#idm130202102752">Valid Expressions</a></span></dt>
  29. <dt><span class="section"><a href="interval.html#idm130202023104">Example of use</a></span></dt>
  30. <dt><span class="section"><a href="interval.html#idm130201930272">Header</a></span></dt>
  31. </dl></div>
  32. <div class="section">
  33. <div class="titlepage"><div><div><h4 class="title">
  34. <a name="idm130202132352"></a>Description</h4></div></div></div>
  35. <p>A closed arithmetic interval represented by a pair of elements of
  36. type R. In principle, one should be able to use Boost.Interval library for
  37. this. But the functions in this library are not <code class="computeroutput">constexpr</code>.
  38. Also, this Boost.Interval is more complex and does not support certain
  39. operations such bit operations. Perhaps some time in the future,
  40. Boost.Interval will be used instead of this <code class="computeroutput">interval&lt;R&gt;</code>
  41. type.</p>
  42. </div>
  43. <div class="section">
  44. <div class="titlepage"><div><div><h4 class="title">
  45. <a name="idm130202129408"></a>Template Parameters</h4></div></div></div>
  46. <p>R must model the type requirements of <a class="link" href="numeric.html" title="Numeric&lt;T&gt;">Numeric</a>. Note this in principle
  47. includes any numeric type including floating point numbers and instances
  48. of <a class="link" href="checked_result.html" title="checked_result&lt;R&gt;"><code class="computeroutput">checked_result&lt;R&gt;</code></a>.</p>
  49. </div>
  50. <div class="section">
  51. <div class="titlepage"><div><div><h4 class="title">
  52. <a name="idm130202126048"></a>Notation</h4></div></div></div>
  53. <div class="informaltable"><table class="table">
  54. <colgroup>
  55. <col align="left">
  56. <col align="left">
  57. </colgroup>
  58. <thead><tr>
  59. <th align="left">Symbol</th>
  60. <th align="left">Description</th>
  61. </tr></thead>
  62. <tbody>
  63. <tr>
  64. <td align="left"><code class="computeroutput">I</code></td>
  65. <td align="left">An interval type</td>
  66. </tr>
  67. <tr>
  68. <td align="left"><code class="computeroutput">i, j</code></td>
  69. <td align="left">An instance of interval type</td>
  70. </tr>
  71. <tr>
  72. <td align="left"><code class="computeroutput">R</code></td>
  73. <td align="left">Numeric types which can be used to make an interval</td>
  74. </tr>
  75. <tr>
  76. <td align="left"><code class="computeroutput">r</code></td>
  77. <td align="left">An instance of type R</td>
  78. </tr>
  79. <tr>
  80. <td align="left"><code class="computeroutput">p</code></td>
  81. <td align="left">An instance of std::pair&lt;R, R&gt;</td>
  82. </tr>
  83. <tr>
  84. <td align="left"><code class="computeroutput">l, u</code></td>
  85. <td align="left">Lowermost and uppermost values in an interval</td>
  86. </tr>
  87. <tr>
  88. <td align="left"><code class="computeroutput">os</code></td>
  89. <td align="left">std::basic_ostream&lt;class CharT, class Traits =
  90. std::char_traits&lt;CharT&gt;&gt;</td>
  91. </tr>
  92. </tbody>
  93. </table></div>
  94. </div>
  95. <div class="section">
  96. <div class="titlepage"><div><div><h4 class="title">
  97. <a name="idm130202108592"></a>Associated Types</h4></div></div></div>
  98. <div class="informaltable"><table class="table">
  99. <colgroup>
  100. <col align="left">
  101. <col align="left">
  102. </colgroup>
  103. <tbody><tr>
  104. <td align="left"><a class="link" href="checked_result.html" title="checked_result&lt;R&gt;"><code class="computeroutput">checked_result</code></a></td>
  105. <td align="left">holds either the result of an operation or information as
  106. to why it failed</td>
  107. </tr></tbody>
  108. </table></div>
  109. </div>
  110. <div class="section">
  111. <div class="titlepage"><div><div><h4 class="title">
  112. <a name="idm130202102752"></a>Valid Expressions</h4></div></div></div>
  113. <p>Note that all expressions are constexpr.</p>
  114. <div class="informaltable"><table class="table">
  115. <colgroup>
  116. <col align="left">
  117. <col align="left">
  118. <col align="left">
  119. </colgroup>
  120. <thead><tr>
  121. <th align="left">Expression</th>
  122. <th align="left">Return Type</th>
  123. <th align="left">Semantics</th>
  124. </tr></thead>
  125. <tbody>
  126. <tr>
  127. <td align="left"><code class="computeroutput">interval&lt;R&gt;(l, u)</code></td>
  128. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  129. <td align="left">construct a new interval from a pair of limits</td>
  130. </tr>
  131. <tr>
  132. <td align="left"><code class="computeroutput">interval&lt;R&gt;(p)</code></td>
  133. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  134. <td align="left">construct a new interval from a pair of limits</td>
  135. </tr>
  136. <tr>
  137. <td align="left"><code class="computeroutput">interval&lt;R&gt;(i)</code></td>
  138. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  139. <td align="left">copy constructor</td>
  140. </tr>
  141. <tr>
  142. <td align="left"><code class="computeroutput">make_interval&lt;R&gt;()</code></td>
  143. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  144. <td align="left">return new interval with
  145. std::numric_limits&lt;R&gt;::min() and
  146. std::numric_limits&lt;R&gt;::max()</td>
  147. </tr>
  148. <tr>
  149. <td align="left"><code class="computeroutput">make_interval&lt;R&gt;(const R
  150. &amp;r)</code></td>
  151. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  152. <td align="left">return new interval with
  153. std::numric_limits&lt;R&gt;::min() and
  154. std::numric_limits&lt;R&gt;::max()</td>
  155. </tr>
  156. <tr>
  157. <td align="left"><code class="computeroutput">i.l</code></td>
  158. <td align="left"><code class="computeroutput">R</code></td>
  159. <td align="left">lowermost value in the interval i</td>
  160. </tr>
  161. <tr>
  162. <td align="left"><code class="computeroutput">i.u</code></td>
  163. <td align="left"><code class="computeroutput">R</code></td>
  164. <td align="left">uppermost value in the interval i</td>
  165. </tr>
  166. <tr>
  167. <td align="left"><code class="computeroutput">i.includes(j)</code></td>
  168. <td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
  169. <td align="left">return true if interval i includes interval j</td>
  170. </tr>
  171. <tr>
  172. <td align="left"><code class="computeroutput">i.excludes(j)</code></td>
  173. <td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
  174. <td align="left">return true if interval i includes interval j</td>
  175. </tr>
  176. <tr>
  177. <td align="left"><code class="computeroutput">i.includes(t)</code></td>
  178. <td align="left"><code class="computeroutput">bool</code></td>
  179. <td align="left">return true if interval i includes value t</td>
  180. </tr>
  181. <tr>
  182. <td align="left"><code class="computeroutput">i.excludes(t)</code></td>
  183. <td align="left"><code class="computeroutput">bool</code></td>
  184. <td align="left">return true if interval i includes value t</td>
  185. </tr>
  186. <tr>
  187. <td align="left"><code class="computeroutput">i + j</code></td>
  188. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  189. <td align="left">add two intervals and return the result</td>
  190. </tr>
  191. <tr>
  192. <td align="left"><code class="computeroutput">i - j</code></td>
  193. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  194. <td align="left">subtract two intervals and return the result</td>
  195. </tr>
  196. <tr>
  197. <td align="left"><code class="computeroutput">i * j</code></td>
  198. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  199. <td align="left">multiply two intervals and return the result</td>
  200. </tr>
  201. <tr>
  202. <td align="left"><code class="computeroutput">i / j</code></td>
  203. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  204. <td align="left">divide one interval by another and return the
  205. result</td>
  206. </tr>
  207. <tr>
  208. <td align="left"><code class="computeroutput">i % j</code></td>
  209. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  210. <td align="left">calculate modulus of one interval by another and return
  211. the result</td>
  212. </tr>
  213. <tr>
  214. <td align="left"><code class="computeroutput">i &lt;&lt; j</code></td>
  215. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  216. <td align="left">calculate the range that would result from shifting one
  217. interval by another</td>
  218. </tr>
  219. <tr>
  220. <td align="left"><code class="computeroutput">i &gt;&gt; j</code></td>
  221. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  222. <td align="left">calculate the range that would result from shifting one
  223. interval by another</td>
  224. </tr>
  225. <tr>
  226. <td align="left"><code class="computeroutput">i | j</code></td>
  227. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  228. <td align="left">range of values which can result from applying | to any
  229. pair of operands from I and j</td>
  230. </tr>
  231. <tr>
  232. <td align="left"><code class="computeroutput">i &amp; j</code></td>
  233. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  234. <td align="left">range of values which can result from applying &amp; to
  235. any pair of operands from I and j</td>
  236. </tr>
  237. <tr>
  238. <td align="left"><code class="computeroutput">i ^ j</code></td>
  239. <td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
  240. <td align="left">range of values which can result from applying ^ to any
  241. pair of operands from I and j</td>
  242. </tr>
  243. <tr>
  244. <td align="left"><code class="computeroutput">t &lt; u</code></td>
  245. <td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
  246. <td align="left">true if every element in t is less than every element in
  247. u</td>
  248. </tr>
  249. <tr>
  250. <td align="left"><code class="computeroutput">t &gt; u</code></td>
  251. <td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
  252. <td align="left">true if every element in t is greater than every element
  253. in u</td>
  254. </tr>
  255. <tr>
  256. <td align="left"><code class="computeroutput">t &lt;= u</code></td>
  257. <td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
  258. <td align="left">true if every element in t is less than or equal to every
  259. element in u</td>
  260. </tr>
  261. <tr>
  262. <td align="left"><code class="computeroutput">t &gt;= u</code></td>
  263. <td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
  264. <td align="left">true if every element in t is greater than or equal to
  265. every element in u</td>
  266. </tr>
  267. <tr>
  268. <td align="left"><code class="computeroutput">t == u</code></td>
  269. <td align="left"><code class="computeroutput">bool</code></td>
  270. <td align="left">true if limits are equal</td>
  271. </tr>
  272. <tr>
  273. <td align="left"><code class="computeroutput">t != u</code></td>
  274. <td align="left"><code class="computeroutput">bool</code></td>
  275. <td align="left">true if limits are not equal</td>
  276. </tr>
  277. <tr>
  278. <td align="left"><code class="computeroutput">os &lt;&lt; i</code></td>
  279. <td align="left"><code class="computeroutput">os &amp;</code></td>
  280. <td align="left">print interval to output stream</td>
  281. </tr>
  282. </tbody>
  283. </table></div>
  284. </div>
  285. <div class="section">
  286. <div class="titlepage"><div><div><h4 class="title">
  287. <a name="idm130202023104"></a>Example of use</h4></div></div></div>
  288. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  289. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cstdint</span><span class="special">&gt;</span>
  290. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  291. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">numeric</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">interval</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  292. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="special">)</span><span class="special">{</span>
  293. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"test1"</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>
  294. <span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span> <span class="identifier">x</span> <span class="special">=</span> <span class="special">{</span><span class="special">-</span><span class="number">64</span><span class="special">,</span> <span class="number">63</span><span class="special">}</span><span class="special">;</span>
  295. <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>
  296. <span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="special">-</span><span class="number">128</span><span class="special">,</span> <span class="number">126</span><span class="special">)</span><span class="special">;</span>
  297. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"y = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">y</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>
  298. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;&gt;</span><span class="special">(</span><span class="identifier">add</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span><span class="identifier">x</span><span class="special">)</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">)</span><span class="special">;</span>
  299. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"x + x ="</span> <span class="special">&lt;&lt;</span> <span class="identifier">add</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">x</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>
  300. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"x - x = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">subtract</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">x</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>
  301. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  302. <span class="special">}</span></pre>
  303. </div>
  304. <div class="section">
  305. <div class="titlepage"><div><div><h4 class="title">
  306. <a name="idm130201930272"></a>Header</h4></div></div></div>
  307. <p><code class="computeroutput">#include
  308. &lt;boost/numeric/safe_numerics/interval.hpp&gt;</code></p>
  309. </div>
  310. </div>
  311. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  312. <td align="left"></td>
  313. <td align="right"><div class="copyright-footer">Copyright &#169; 2012-2018 Robert Ramey<p><a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">Subject to Boost
  314. Software License</a></p>
  315. </div></td>
  316. </tr></table>
  317. <hr>
  318. <div class="spirit-nav">
  319. <a accesskey="p" href="checked_arithmetic.html"><img src="images/prev.png" alt="Prev"></a><a accesskey="u" href="library_implementation.html"><img src="images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home"></a><a accesskey="n" href="checked_integer_arithmetic.html"><img src="images/next.png" alt="Next"></a>
  320. </div>
  321. </body>
  322. </html>