• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5<title>Appendices</title>
6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
9<link rel="up" href="../ratio.html" title="Chapter 34. Boost.Ratio 2.1.0">
10<link rel="prev" href="reference.html" title="Reference">
11<link rel="next" href="../signals2.html" title="Chapter 35. Boost.Signals2">
12</head>
13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14<table cellpadding="2" width="100%"><tr>
15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16<td align="center"><a href="../../../index.html">Home</a></td>
17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20<td align="center"><a href="../../../more/index.htm">More</a></td>
21</tr></table>
22<hr>
23<div class="spirit-nav">
24<a accesskey="p" href="reference.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../ratio.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="../signals2.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
25</div>
26<div class="section">
27<div class="titlepage"><div><div><h2 class="title" style="clear: both">
28<a name="ratio.appendices"></a><a class="link" href="appendices.html" title="Appendices">Appendices</a>
29</h2></div></div></div>
30<div class="toc"><dl class="toc">
31<dt><span class="section"><a href="appendices.html#ratio.appendices.history">Appendix A: History</a></span></dt>
32<dt><span class="section"><a href="appendices.html#ratio.appendices.rationale">Appendix B: Rationale</a></span></dt>
33<dt><span class="section"><a href="appendices.html#ratio.appendices.implementation">Appendix C: Implementation
34      Notes</a></span></dt>
35<dt><span class="section"><a href="appendices.html#ratio.appendices.faq">Appendix D: FAQ</a></span></dt>
36<dt><span class="section"><a href="appendices.html#ratio.appendices.acknowledgements">Appendix E: Acknowledgements</a></span></dt>
37<dt><span class="section"><a href="appendices.html#ratio.appendices.tests">Appendix F: Tests</a></span></dt>
38<dt><span class="section"><a href="appendices.html#ratio.appendices.tickets">Appendix G: Tickets</a></span></dt>
39<dt><span class="section"><a href="appendices.html#ratio.appendices.todo">Appendix H: Future Plans</a></span></dt>
40</dl></div>
41<div class="section">
42<div class="titlepage"><div><div><h3 class="title">
43<a name="ratio.appendices.history"></a><a class="link" href="appendices.html#ratio.appendices.history" title="Appendix A: History">Appendix A: History</a>
44</h3></div></div></div>
45<div class="toc"><dl class="toc">
46<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_2_1_0__febreary_1__2014___1_56__"><span class="bold"><strong>Version 2.1.0, Febreary 1, 2014 - 1.56</strong></span> </a></span></dt>
47<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_2_0_1__febreary_1__2013___1_53__"><span class="bold"><strong>Version 2.0.1, Febreary 1, 2013 - 1.53</strong></span> </a></span></dt>
48<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_2_0_0__november_1__2012___1_52__"><span class="bold"><strong>Version 2.0.0, November 1, 2012 - 1.52</strong></span> </a></span></dt>
49<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_1_0_3__august_1__2012___1_51__"><span class="bold"><strong>Version 1.0.3, August 1, 2012 - 1.51</strong></span> </a></span></dt>
50<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_1_0_2__april_1__2012___1_50__"><span class="bold"><strong>Version 1.0.2, April 1, 2012 - 1.50</strong></span> </a></span></dt>
51<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_1_0_1__jan_8__2011___"><span class="bold"><strong>Version 1.0.1, Jan 8, 2011 </strong></span> </a></span></dt>
52<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_1_0_0__jan_2__2011__"><span class="bold"><strong>Version 1.0.0, Jan 2, 2011</strong></span> </a></span></dt>
53<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_0_2_1__september_27__2010__"><span class="bold"><strong>Version 0.2.1, September 27, 2010</strong></span> </a></span></dt>
54<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_0_2_0__september_22__2010__"><span class="bold"><strong>Version 0.2.0, September 22, 2010</strong></span> </a></span></dt>
55<dt><span class="section"><a href="appendices.html#ratio.appendices.history.__version_0_1_0__september_10__2010__"><span class="bold"><strong>Version 0.1.0, September 10, 2010</strong></span> </a></span></dt>
56</dl></div>
57<div class="section">
58<div class="titlepage"><div><div><h4 class="title">
59<a name="ratio.appendices.history.__version_2_1_0__febreary_1__2014___1_56__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_2_1_0__febreary_1__2014___1_56__" title="Version 2.1.0, Febreary 1, 2014 - 1.56"><span class="bold"><strong>Version 2.1.0, Febreary 1, 2014 - 1.56</strong></span> </a>
60</h4></div></div></div>
61<p>
62          <span class="bold"><strong>New Features:</strong></span>
63        </p>
64<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
65<li class="listitem">
66              <a href="http://svn.boost.org/trac/boost/ticket/XXXX" target="_top">#XXXX</a>
67              Add ratio_power.
68            </li>
69<li class="listitem">
70              <a href="http://svn.boost.org/trac/boost/ticket/XXXX" target="_top">#XXXX</a>
71              Add IEC binary prefixes.
72            </li>
73</ul></div>
74</div>
75<div class="section">
76<div class="titlepage"><div><div><h4 class="title">
77<a name="ratio.appendices.history.__version_2_0_1__febreary_1__2013___1_53__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_2_0_1__febreary_1__2013___1_53__" title="Version 2.0.1, Febreary 1, 2013 - 1.53"><span class="bold"><strong>Version 2.0.1, Febreary 1, 2013 - 1.53</strong></span> </a>
78</h4></div></div></div>
79<p>
80          <span class="bold"><strong>Fixes:</strong></span>
81        </p>
82<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
83              <a href="http://svn.boost.org/trac/boost/ticket/7616" target="_top">#7616</a>
84              br_mul::nan - warning C4293: '&lt;&lt;' : shift count negative or too
85              big, undefined behavior`.
86            </li></ul></div>
87</div>
88<div class="section">
89<div class="titlepage"><div><div><h4 class="title">
90<a name="ratio.appendices.history.__version_2_0_0__november_1__2012___1_52__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_2_0_0__november_1__2012___1_52__" title="Version 2.0.0, November 1, 2012 - 1.52"><span class="bold"><strong>Version 2.0.0, November 1, 2012 - 1.52</strong></span> </a>
91</h4></div></div></div>
92<p>
93          <span class="bold"><strong>Features:</strong></span>
94        </p>
95<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
96              Replace the short_name and long_name functions by symbol and prefix
97              functions respectively.
98            </li></ul></div>
99<p>
100          <span class="bold"><strong>Deprecated:</strong></span>
101        </p>
102<p>
103          The ratio_string&lt;&gt;::short_name and ratio_string&lt;&gt;::long_name
104          are deprecated. Use ratio_string&lt;&gt;::symbol and ratio_string&lt;&gt;::prefix
105          respectively. These functions be removed in 1.55.
106        </p>
107<p>
108          <span class="bold"><strong>Fixes:</strong></span>
109        </p>
110<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
111              <a href="http://svn.boost.org/trac/boost/ticket/7478" target="_top">#7478</a>
112              Compiles fails with compilers supporting char16_t and char32_t fails
113              if the library doesn't provides std::u16string and std::u32string.
114            </li></ul></div>
115</div>
116<div class="section">
117<div class="titlepage"><div><div><h4 class="title">
118<a name="ratio.appendices.history.__version_1_0_3__august_1__2012___1_51__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_1_0_3__august_1__2012___1_51__" title="Version 1.0.3, August 1, 2012 - 1.51"><span class="bold"><strong>Version 1.0.3, August 1, 2012 - 1.51</strong></span> </a>
119</h4></div></div></div>
120<p>
121          <span class="bold"><strong>Fixes:</strong></span>
122        </p>
123<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
124              <a href="http://svn.boost.org/trac/boost/ticket/7075" target="_top">#7075</a>
125              Workaround for error: the type of partial specialization template parameter
126              constant "n1" depends on another template parameter.
127            </li></ul></div>
128</div>
129<div class="section">
130<div class="titlepage"><div><div><h4 class="title">
131<a name="ratio.appendices.history.__version_1_0_2__april_1__2012___1_50__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_1_0_2__april_1__2012___1_50__" title="Version 1.0.2, April 1, 2012 - 1.50"><span class="bold"><strong>Version 1.0.2, April 1, 2012 - 1.50</strong></span> </a>
132</h4></div></div></div>
133<p>
134          <span class="bold"><strong>Fixes:</strong></span>
135        </p>
136<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
137              <a href="http://svn.boost.org/trac/boost/ticket/6498" target="_top">#6498</a>
138              boost::ratio won't compile with default settings.
139            </li></ul></div>
140</div>
141<div class="section">
142<div class="titlepage"><div><div><h4 class="title">
143<a name="ratio.appendices.history.__version_1_0_1__jan_8__2011___"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_1_0_1__jan_8__2011___" title="Version 1.0.1, Jan 8, 2011"><span class="bold"><strong>Version 1.0.1, Jan 8, 2011 </strong></span> </a>
144</h4></div></div></div>
145<p>
146          <span class="bold"><strong>Features:</strong></span>
147        </p>
148<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
149              Added MPL Rational Constant and the associated numeric metafunction
150              specializations.
151            </li></ul></div>
152</div>
153<div class="section">
154<div class="titlepage"><div><div><h4 class="title">
155<a name="ratio.appendices.history.__version_1_0_0__jan_2__2011__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_1_0_0__jan_2__2011__" title="Version 1.0.0, Jan 2, 2011"><span class="bold"><strong>Version 1.0.0, Jan 2, 2011</strong></span> </a>
156</h4></div></div></div>
157<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
158<li class="listitem">
159              Moved ratio to trunk.
160            </li>
161<li class="listitem">
162              Documentation revision.
163            </li>
164</ul></div>
165</div>
166<div class="section">
167<div class="titlepage"><div><div><h4 class="title">
168<a name="ratio.appendices.history.__version_0_2_1__september_27__2010__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_0_2_1__september_27__2010__" title="Version 0.2.1, September 27, 2010"><span class="bold"><strong>Version 0.2.1, September 27, 2010</strong></span> </a>
169</h4></div></div></div>
170<p>
171          <span class="bold"><strong>Fixes:</strong></span>
172        </p>
173<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
174              Removal of LLVM adapted files due to incompatible License issue.
175            </li></ul></div>
176</div>
177<div class="section">
178<div class="titlepage"><div><div><h4 class="title">
179<a name="ratio.appendices.history.__version_0_2_0__september_22__2010__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_0_2_0__september_22__2010__" title="Version 0.2.0, September 22, 2010"><span class="bold"><strong>Version 0.2.0, September 22, 2010</strong></span> </a>
180</h4></div></div></div>
181<p>
182          <span class="bold"><strong>Features:</strong></span>
183        </p>
184<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
185              Added ratio_string traits.
186            </li></ul></div>
187<p>
188          <span class="bold"><strong>Fixes:</strong></span>
189        </p>
190<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
191              ratio_less overflow avoided following the algorithm from libc++.
192            </li></ul></div>
193<p>
194          <span class="bold"><strong>Test:</strong></span>
195        </p>
196<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
197              A more complete test has been included adapted from the test of from
198              libc++/ratio.
199            </li></ul></div>
200</div>
201<div class="section">
202<div class="titlepage"><div><div><h4 class="title">
203<a name="ratio.appendices.history.__version_0_1_0__september_10__2010__"></a><a class="link" href="appendices.html#ratio.appendices.history.__version_0_1_0__september_10__2010__" title="Version 0.1.0, September 10, 2010"><span class="bold"><strong>Version 0.1.0, September 10, 2010</strong></span> </a>
204</h4></div></div></div>
205<p>
206          <span class="bold"><strong>Features:</strong></span>
207        </p>
208<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
209              Ratio has been extracted from Boost.Chrono.
210            </li></ul></div>
211</div>
212</div>
213<div class="section">
214<div class="titlepage"><div><div><h3 class="title">
215<a name="ratio.appendices.rationale"></a><a class="link" href="appendices.html#ratio.appendices.rationale" title="Appendix B: Rationale">Appendix B: Rationale</a>
216</h3></div></div></div>
217<h5>
218<a name="ratio.appendices.rationale.h0"></a>
219        <span class="phrase"><a name="ratio.appendices.rationale.why_ratio_needs_copyconstruction_and_assignment_from_ratios_having_the_same_normalized_form"></a></span><a class="link" href="appendices.html#ratio.appendices.rationale.why_ratio_needs_copyconstruction_and_assignment_from_ratios_having_the_same_normalized_form">Why
220        ratio needs CopyConstruction and Assignment from ratios having the same normalized
221        form</a>
222      </h5>
223<p>
224        Current <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n3000.pdf" target="_top"><span class="bold"><strong>N3000</strong></span></a> doesn't allows to copy-construct or
225        assign ratio instances of ratio classes having the same normalized form.
226      </p>
227<p>
228        This simple example
229      </p>
230<pre class="programlisting"><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">&gt;</span> <span class="identifier">r1</span><span class="special">;</span>
231<a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special">&lt;</span><span class="number">3</span><span class="special">,</span><span class="number">9</span><span class="special">&gt;</span> <span class="identifier">r2</span><span class="special">;</span>
232<span class="identifier">r1</span> <span class="special">=</span> <span class="identifier">r2</span><span class="special">;</span> <span class="comment">// (1)</span>
233</pre>
234<p>
235        fails to compile in (1). Other example
236      </p>
237<pre class="programlisting"><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">&gt;</span> <span class="identifier">r1</span><span class="special">;</span>
238<a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio_arithmetic" title="ratio Arithmetic"><code class="computeroutput"><span class="identifier">ratio_subtract</span></code></a><span class="special">&lt;</span><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special">&lt;</span><span class="number">2</span><span class="special">,</span><span class="number">3</span><span class="special">&gt;,</span><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">r2</span><span class="special">=</span><span class="identifier">r1</span><span class="special">;</span>  <span class="comment">// (2)</span>
239</pre>
240<p>
241        The type of <code class="computeroutput"><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio_arithmetic" title="ratio Arithmetic"><code class="computeroutput"><span class="identifier">ratio_subtract</span></code></a><span class="special">&lt;</span><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special">&lt;</span><span class="number">2</span><span class="special">,</span><span class="number">3</span><span class="special">&gt;,</span><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">&gt;</span> <span class="special">&gt;</span></code>
242        could be <code class="computeroutput"><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special">&lt;</span><span class="number">3</span><span class="special">,</span><span class="number">9</span><span class="special">&gt;</span></code> so the compilation could fail in (2).
243        It could also be <a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio&lt;&gt;"><code class="computeroutput"><span class="identifier">ratio</span></code></a>&lt;1,3&gt; and the compilation
244        succeeds.
245      </p>
246<h5>
247<a name="ratio.appendices.rationale.h1"></a>
248        <span class="phrase"><a name="ratio.appendices.rationale.why_ratio_needs_the_nested_normalizer_typedef_type"></a></span><a class="link" href="appendices.html#ratio.appendices.rationale.why_ratio_needs_the_nested_normalizer_typedef_type">Why
249        ratio needs the nested normalizer typedef type</a>
250      </h5>
251<p>
252        The current resolution of issue LWG 1281 acknowledges the need for a nested
253        type typedef, so Boost.Ratio is tracking the likely final version of std::ratio.
254      </p>
255</div>
256<div class="section">
257<div class="titlepage"><div><div><h3 class="title">
258<a name="ratio.appendices.implementation"></a><a class="link" href="appendices.html#ratio.appendices.implementation" title="Appendix C: Implementation Notes">Appendix C: Implementation
259      Notes</a>
260</h3></div></div></div>
261<h5>
262<a name="ratio.appendices.implementation.h0"></a>
263        <span class="phrase"><a name="ratio.appendices.implementation.how_does_boost_ratio_try_to_avoid_compile_time_rational_arithmetic_overflow_"></a></span><a class="link" href="appendices.html#ratio.appendices.implementation.how_does_boost_ratio_try_to_avoid_compile_time_rational_arithmetic_overflow_">How
264        does Boost.Ratio try to avoid compile-time rational arithmetic overflow?</a>
265      </h5>
266<p>
267        When the result is representable, but a simple application of arithmetic
268        rules would result in overflow, e.g. <code class="computeroutput"><span class="identifier">ratio_multiply</span><span class="special">&lt;</span><span class="identifier">ratio</span><span class="special">&lt;</span><span class="identifier">INTMAX_MAX</span><span class="special">,</span><span class="number">2</span><span class="special">&gt;,</span><span class="identifier">ratio</span><span class="special">&lt;</span><span class="number">2</span><span class="special">,</span><span class="identifier">INTMAX_MAX</span><span class="special">&gt;&gt;</span></code> can be reduced to <code class="computeroutput"><span class="identifier">ratio</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span><span class="number">1</span><span class="special">&gt;</span></code>, but
269        the direct result of <code class="computeroutput"><span class="identifier">ratio</span><span class="special">&lt;</span><span class="identifier">INTMAX_MAX</span><span class="special">*</span><span class="number">2</span><span class="special">,</span><span class="identifier">INTMAX_MAX</span><span class="special">*</span><span class="number">2</span><span class="special">&gt;</span></code> would
270        result in overflow.
271      </p>
272<p>
273        Boost.Ratio implements some simplifications in order to reduce the possibility
274        of overflow. The general ideas are:
275      </p>
276<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
277<li class="listitem">
278            The <code class="computeroutput"><span class="identifier">num</span></code> and <code class="computeroutput"><span class="identifier">den</span></code> <code class="computeroutput"><span class="identifier">ratio</span><span class="special">&lt;&gt;</span></code> fields are normalized.
279          </li>
280<li class="listitem">
281            Use the gcd of some of the possible products that can overflow, and simplify
282            before doing the product.
283          </li>
284<li class="listitem">
285            Use some equivalences relations that avoid addition or subtraction that
286            can overflow or underflow.
287          </li>
288</ul></div>
289<p>
290        The following subsections cover each case in more detail.
291      </p>
292<p>
293        <span class="bold"><strong>ratio_add</strong></span>
294      </p>
295<p>
296        In
297      </p>
298<pre class="programlisting"><span class="special">(</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)+(</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)=(</span><span class="identifier">n1</span><span class="special">*</span><span class="identifier">d2</span><span class="special">+</span><span class="identifier">n2</span><span class="special">*</span><span class="identifier">d1</span><span class="special">)/(</span><span class="identifier">d1</span><span class="special">*</span><span class="identifier">d2</span><span class="special">)</span>
299</pre>
300<p>
301        either n1*d2+n2*d1 or d1*d2 can overflow.
302      </p>
303<pre class="programlisting"><span class="special">(</span> <span class="special">(</span><span class="identifier">n1</span> <span class="special">*</span> <span class="identifier">d2</span><span class="special">)</span>  <span class="special">+</span> <span class="special">(</span><span class="identifier">n2</span> <span class="special">*</span> <span class="identifier">d1</span><span class="special">)</span> <span class="special">)</span>
304<span class="special">--------------------------</span>
305         <span class="special">(</span><span class="identifier">d1</span> <span class="special">*</span> <span class="identifier">d2</span><span class="special">)</span>
306</pre>
307<p>
308        Dividing by gcd(d1,d2) on both num and den
309      </p>
310<pre class="programlisting"><span class="special">(</span> <span class="special">(</span><span class="identifier">n1</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span>  <span class="special">+</span> <span class="special">(</span><span class="identifier">n2</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">)</span>
311<span class="special">----------------------------------------------------</span>
312               <span class="special">((</span><span class="identifier">d1</span> <span class="special">*</span> <span class="identifier">d2</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">))</span>
313</pre>
314<p>
315        Multiplying and diving by gcd(n1,n2) in numerator
316      </p>
317<pre class="programlisting"><span class="special">(</span> <span class="special">((</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">)*(</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">)))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span>  <span class="special">+</span>
318  <span class="special">((</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">)*(</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">)))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span>
319<span class="special">)</span>
320<span class="special">--------------------------------------------------</span>
321         <span class="special">(</span> <span class="special">(</span><span class="identifier">d1</span> <span class="special">*</span> <span class="identifier">d2</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)</span> <span class="special">)</span>
322</pre>
323<p>
324        Factorizing gcd(n1,n2)
325      </p>
326<pre class="programlisting"><span class="special">(</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">)</span> <span class="special">*</span>
327  <span class="special">(</span> <span class="special">((</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">+</span> <span class="special">((</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">)</span>
328<span class="special">)</span>
329<span class="special">-------------------------------------------------------------------------------</span>
330                            <span class="special">(</span> <span class="special">(</span><span class="identifier">d1</span> <span class="special">*</span> <span class="identifier">d2</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)</span> <span class="special">)</span>
331</pre>
332<p>
333        Regrouping
334      </p>
335<pre class="programlisting"><span class="special">(</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">)</span> <span class="special">*</span>
336  <span class="special">(</span> <span class="special">((</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">+</span> <span class="special">((</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">)</span>
337<span class="special">)</span>
338<span class="special">-------------------------------------------------------------------------------</span>
339                          <span class="special">(</span> <span class="special">(</span><span class="identifier">d1</span> <span class="special">/</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">))</span> <span class="special">*</span> <span class="identifier">d2</span> <span class="special">)</span>
340</pre>
341<p>
342        Dividing by (d1 / gcd(d1,d2))
343      </p>
344<pre class="programlisting"><span class="special">(</span> <span class="special">(</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">)</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">d1</span> <span class="special">/</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">))</span> <span class="special">)</span> <span class="special">*</span>
345  <span class="special">(</span> <span class="special">((</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">+</span> <span class="special">((</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">)</span>
346<span class="special">)</span>
347<span class="special">-------------------------------------------------------------------------------</span>
348                                       <span class="identifier">d2</span>
349</pre>
350<p>
351        Dividing by d2
352      </p>
353<pre class="programlisting"><span class="special">(</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">)</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">d1</span> <span class="special">/</span> <span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">))</span> <span class="special">)</span> <span class="special">*</span>
354<span class="special">(</span> <span class="special">((</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">+</span> <span class="special">((</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">n2</span><span class="special">))</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">d1</span><span class="special">/</span><span class="identifier">gcd</span><span class="special">(</span><span class="identifier">d1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span> <span class="special">/</span> <span class="identifier">d2</span> <span class="special">)</span>
355</pre>
356<p>
357        This expression correspond to the multiply of two ratios that have less risk
358        of overflow as the initial numerators and denominators appear now in most
359        of the cases divided by a gcd.
360      </p>
361<p>
362        For ratio_subtract the reasoning is the same.
363      </p>
364<p>
365        <span class="bold"><strong>ratio_multiply</strong></span>
366      </p>
367<p>
368        In
369      </p>
370<pre class="programlisting"><span class="special">(</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)*(</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)=((</span><span class="identifier">n1</span><span class="special">*</span><span class="identifier">n2</span><span class="special">)/(</span><span class="identifier">d1</span><span class="special">*</span><span class="identifier">d2</span><span class="special">))</span>
371</pre>
372<p>
373        either n1*n2 or d1*d2 can overflow.
374      </p>
375<p>
376        Dividing by gcc(n1,d2) numerator and denominator
377      </p>
378<pre class="programlisting"><span class="special">(((</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">gcc</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">))*</span><span class="identifier">n2</span><span class="special">)</span>
379<span class="special">---------------------</span>
380<span class="special">(</span><span class="identifier">d1</span><span class="special">*(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">gcc</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">))))</span>
381</pre>
382<p>
383        Dividing by gcc(n2,d1)
384      </p>
385<pre class="programlisting"><span class="special">((</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">gcc</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">))*(</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">gcc</span><span class="special">(</span><span class="identifier">n2</span><span class="special">,</span><span class="identifier">d1</span><span class="special">)))</span>
386<span class="special">---------------------------------</span>
387<span class="special">((</span><span class="identifier">d1</span><span class="special">/</span><span class="identifier">gcc</span><span class="special">(</span><span class="identifier">n2</span><span class="special">,</span><span class="identifier">d1</span><span class="special">))*(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">gcc</span><span class="special">(</span><span class="identifier">n1</span><span class="special">,</span><span class="identifier">d2</span><span class="special">)))</span>
388</pre>
389<p>
390        And now all the initial numerator and denominators have been reduced, avoiding
391        the overflow.
392      </p>
393<p>
394        For ratio_divide the reasoning is similar.
395      </p>
396<p>
397        <span class="bold"><strong>ratio_less</strong></span>
398      </p>
399<p>
400        In order to evaluate
401      </p>
402<pre class="programlisting"><span class="special">(</span><span class="identifier">n1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)&lt;(</span><span class="identifier">n2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span>
403</pre>
404<p>
405        without moving to floating-point numbers, two techniques are used:
406      </p>
407<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
408            First compare the sign of the numerators.
409          </li></ul></div>
410<p>
411        If sign(n1) &lt; sign(n2) the result is true.
412      </p>
413<p>
414        If sign(n1) == sign(n2) the result depends on the following after making
415        the numerators positive
416      </p>
417<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
418            When the sign is equal the technique used is to work with integer division
419            and modulo when the signs are equal.
420          </li></ul></div>
421<p>
422        Let call Qi the integer division of ni and di, and Mi the modulo of ni and
423        di.
424      </p>
425<pre class="programlisting"><span class="identifier">ni</span> <span class="special">=</span> <span class="identifier">Qi</span> <span class="special">*</span> <span class="identifier">di</span> <span class="special">+</span> <span class="identifier">Mi</span> <span class="keyword">and</span> <span class="identifier">Mi</span> <span class="special">&lt;</span> <span class="identifier">di</span>
426</pre>
427<p>
428        Form
429      </p>
430<pre class="programlisting"><span class="special">((</span><span class="identifier">n1</span><span class="special">*</span><span class="identifier">d2</span><span class="special">)&lt;(</span><span class="identifier">d1</span><span class="special">*</span><span class="identifier">n2</span><span class="special">))</span>
431</pre>
432<p>
433        we get
434      </p>
435<pre class="programlisting"><span class="special">(((</span><span class="identifier">Q1</span> <span class="special">*</span> <span class="identifier">d1</span> <span class="special">+</span> <span class="identifier">M1</span><span class="special">)*</span><span class="identifier">d2</span><span class="special">)&lt;(</span><span class="identifier">d1</span><span class="special">*((</span><span class="identifier">Q2</span> <span class="special">*</span> <span class="identifier">d2</span> <span class="special">+</span> <span class="identifier">M2</span><span class="special">))))</span>
436</pre>
437<p>
438        Developing
439      </p>
440<pre class="programlisting"><span class="special">((</span><span class="identifier">Q1</span> <span class="special">*</span> <span class="identifier">d1</span> <span class="special">*</span> <span class="identifier">d2</span><span class="special">)+</span> <span class="special">(</span><span class="identifier">M1</span><span class="special">*</span><span class="identifier">d2</span><span class="special">))&lt;((</span><span class="identifier">d1</span> <span class="special">*</span> <span class="identifier">Q2</span> <span class="special">*</span> <span class="identifier">d2</span><span class="special">)</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">d1</span><span class="special">*</span><span class="identifier">M2</span><span class="special">))</span>
441</pre>
442<p>
443        Dividing by d1*d2
444      </p>
445<pre class="programlisting"><span class="identifier">Q1</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span> <span class="special">&lt;</span> <span class="identifier">Q2</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span>
446</pre>
447<p>
448        If Q1=Q2 the result depends on
449      </p>
450<pre class="programlisting"><span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span> <span class="special">&lt;</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span>
451</pre>
452<p>
453        If M1==0==M2 the result is false
454      </p>
455<p>
456        If M1=0 M2!=0 the result is true
457      </p>
458<p>
459        If M1!=0 M2==0 the result is false
460      </p>
461<p>
462        If M1!=0 M2!=0 the result depends on
463      </p>
464<pre class="programlisting"><span class="special">(</span><span class="identifier">d2</span><span class="special">/</span><span class="identifier">M2</span><span class="special">)</span> <span class="special">&lt;</span> <span class="special">(</span><span class="identifier">d1</span><span class="special">/</span><span class="identifier">M1</span><span class="special">)</span>
465</pre>
466<p>
467        If Q1!=Q2, the result of
468      </p>
469<pre class="programlisting"><span class="identifier">Q1</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span> <span class="special">&lt;</span> <span class="identifier">Q2</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span>
470</pre>
471<p>
472        depends only on Q1 and Q2 as Qi are integers and (Mi/di) &lt;1 because Mi&lt;di.
473      </p>
474<p>
475        if Q1&gt;Q2, Q1==Q2+k, k&gt;=1
476      </p>
477<pre class="programlisting"><span class="identifier">Q2</span><span class="special">+</span><span class="identifier">k</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span> <span class="special">&lt;</span> <span class="identifier">Q2</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span>
478<span class="identifier">k</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span> <span class="special">&lt;</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span>
479<span class="identifier">k</span> <span class="special">&lt;</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span> <span class="special">-</span> <span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span>
480</pre>
481<p>
482        but the difference between two numbers between 0 and 1 can not be greater
483        than 1, so the result is false.
484      </p>
485<p>
486        if Q2&gt;Q1, Q2==Q1+k, k&gt;=1
487      </p>
488<pre class="programlisting"><span class="identifier">Q1</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span> <span class="special">&lt;</span> <span class="identifier">Q1</span><span class="special">+</span><span class="identifier">k</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span>
489<span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span> <span class="special">&lt;</span> <span class="identifier">k</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span>
490<span class="special">(</span><span class="identifier">M1</span><span class="special">/</span><span class="identifier">d1</span><span class="special">)</span> <span class="special">-</span> <span class="special">(</span><span class="identifier">M2</span><span class="special">/</span><span class="identifier">d2</span><span class="special">)</span> <span class="special">&lt;</span> <span class="identifier">k</span>
491</pre>
492<p>
493        which is always true, so the result is true.
494      </p>
495<p>
496        The following table recapitulates this analisys
497      </p>
498<div class="informaltable"><table class="table">
499<colgroup>
500<col>
501<col>
502<col>
503<col>
504<col>
505<col>
506<col>
507</colgroup>
508<thead><tr>
509<th>
510                <p>
511                  ratio&lt;n1,d1&gt;
512                </p>
513              </th>
514<th>
515                <p>
516                  ratio&lt;n2,d2&gt;
517                </p>
518              </th>
519<th>
520                <p>
521                  Q1
522                </p>
523              </th>
524<th>
525                <p>
526                  Q2
527                </p>
528              </th>
529<th>
530                <p>
531                  M1
532                </p>
533              </th>
534<th>
535                <p>
536                  M2
537                </p>
538              </th>
539<th>
540                <p>
541                  Result
542                </p>
543              </th>
544</tr></thead>
545<tbody>
546<tr>
547<td>
548                <p>
549                  ratio&lt;n1,d1&gt;
550                </p>
551              </td>
552<td>
553                <p>
554                  ratio&lt;n2,d2&gt;
555                </p>
556              </td>
557<td>
558                <p>
559                  Q1
560                </p>
561              </td>
562<td>
563                <p>
564                  Q2
565                </p>
566              </td>
567<td>
568                <p>
569                  !=0
570                </p>
571              </td>
572<td>
573                <p>
574                  !=0
575                </p>
576              </td>
577<td>
578                <p>
579                  Q1 &lt; Q2
580                </p>
581              </td>
582</tr>
583<tr>
584<td>
585                <p>
586                  ratio&lt;n1,d1&gt;
587                </p>
588              </td>
589<td>
590                <p>
591                  ratio&lt;n2,d2&gt;
592                </p>
593              </td>
594<td>
595                <p>
596                  Q
597                </p>
598              </td>
599<td>
600                <p>
601                  Q
602                </p>
603              </td>
604<td>
605                <p>
606                  0
607                </p>
608              </td>
609<td>
610                <p>
611                  0
612                </p>
613              </td>
614<td>
615                <p>
616                  false
617                </p>
618              </td>
619</tr>
620<tr>
621<td>
622                <p>
623                  ratio&lt;n1,d1&gt;
624                </p>
625              </td>
626<td>
627                <p>
628                  ratio&lt;n2,d2&gt;
629                </p>
630              </td>
631<td>
632                <p>
633                  Q
634                </p>
635              </td>
636<td>
637                <p>
638                  Q
639                </p>
640              </td>
641<td>
642                <p>
643                  0
644                </p>
645              </td>
646<td>
647                <p>
648                  !=0
649                </p>
650              </td>
651<td>
652                <p>
653                  true
654                </p>
655              </td>
656</tr>
657<tr>
658<td>
659                <p>
660                  ratio&lt;n1,d1&gt;
661                </p>
662              </td>
663<td>
664                <p>
665                  ratio&lt;n2,d2&gt;
666                </p>
667              </td>
668<td>
669                <p>
670                  Q
671                </p>
672              </td>
673<td>
674                <p>
675                  Q
676                </p>
677              </td>
678<td>
679                <p>
680                  !=0
681                </p>
682              </td>
683<td>
684                <p>
685                  0
686                </p>
687              </td>
688<td>
689                <p>
690                  false
691                </p>
692              </td>
693</tr>
694<tr>
695<td>
696                <p>
697                  ratio&lt;n1,d1&gt;
698                </p>
699              </td>
700<td>
701                <p>
702                  ratio&lt;n2,d2&gt;
703                </p>
704              </td>
705<td>
706                <p>
707                  Q
708                </p>
709              </td>
710<td>
711                <p>
712                  Q
713                </p>
714              </td>
715<td>
716                <p>
717                  !=0
718                </p>
719              </td>
720<td>
721                <p>
722                  !=0
723                </p>
724              </td>
725<td>
726                <p>
727                  ratio_less&lt;ratio&lt;d2,M2&gt;, ratio&lt;d1/M1&gt;&gt;
728                </p>
729              </td>
730</tr>
731</tbody>
732</table></div>
733</div>
734<div class="section"><div class="titlepage"><div><div><h3 class="title">
735<a name="ratio.appendices.faq"></a><a class="link" href="appendices.html#ratio.appendices.faq" title="Appendix D: FAQ">Appendix D: FAQ</a>
736</h3></div></div></div></div>
737<div class="section">
738<div class="titlepage"><div><div><h3 class="title">
739<a name="ratio.appendices.acknowledgements"></a><a class="link" href="appendices.html#ratio.appendices.acknowledgements" title="Appendix E: Acknowledgements">Appendix E: Acknowledgements</a>
740</h3></div></div></div>
741<p>
742        The library code was derived from Howard Hinnant's <code class="computeroutput"><span class="identifier">time2_demo</span></code>
743        prototype. Many thanks to Howard for making his code available under the
744        Boost license. The original code was modified by Beman Dawes to conform to
745        Boost conventions.
746      </p>
747<p>
748        <code class="computeroutput"><span class="identifier">time2_demo</span></code> contained this
749        comment:
750      </p>
751<p>
752        Much thanks to Andrei Alexandrescu, Walter Brown, Peter Dimov, Jeff Garland,
753        Terry Golubiewski, Daniel Krugler, Anthony Williams.
754      </p>
755<p>
756        Howard Hinnant, who is the real author of the library, has provided valuable
757        feedback and suggestions during the development of the library. In particular,
758        The ratio_io.hpp source has been adapted from the experimental header <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">ratio_io</span><span class="special">&gt;</span></code> from Howard Hinnant.
759      </p>
760<p>
761        The acceptance review of Boost.Ratio took place between October 2nd and 11th
762        2010. Many thanks to Anthony Williams, the review manager, and to all the
763        reviewers: Bruno Santos, Joel Falcou, Robert Stewart, Roland Bock, Tom Tan
764        and Paul A. Bristol.
765      </p>
766<p>
767        Thanks to Andrew Chinoff and Paul A. Bristol for his help polishing the documentation.
768      </p>
769</div>
770<div class="section">
771<div class="titlepage"><div><div><h3 class="title">
772<a name="ratio.appendices.tests"></a><a class="link" href="appendices.html#ratio.appendices.tests" title="Appendix F: Tests">Appendix F: Tests</a>
773</h3></div></div></div>
774<div class="toc"><dl class="toc">
775<dt><span class="section"><a href="appendices.html#ratio.appendices.tests._ratio_"><code class="computeroutput"><span class="identifier">ratio</span></code></a></span></dt>
776<dt><span class="section"><a href="appendices.html#ratio.appendices.tests._comparison_"><code class="computeroutput"><span class="identifier">comparison</span></code></a></span></dt>
777<dt><span class="section"><a href="appendices.html#ratio.appendices.tests._arithmetic_"><code class="computeroutput"><span class="identifier">arithmetic</span></code></a></span></dt>
778</dl></div>
779<p>
780        In order to test you need to run
781      </p>
782<pre class="programlisting"><span class="identifier">bjam</span> <span class="identifier">libs</span><span class="special">/</span><span class="identifier">ratio</span><span class="special">/</span><span class="identifier">test</span>
783</pre>
784<p>
785        You can also run a specific suite of test by doing
786      </p>
787<pre class="programlisting"><span class="identifier">cd</span> <span class="identifier">libs</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">test</span>
788<span class="identifier">bjam</span> <span class="identifier">ratio</span>
789</pre>
790<div class="section">
791<div class="titlepage"><div><div><h4 class="title">
792<a name="ratio.appendices.tests._ratio_"></a><a class="link" href="appendices.html#ratio.appendices.tests._ratio_" title="ratio"><code class="computeroutput"><span class="identifier">ratio</span></code></a>
793</h4></div></div></div>
794<div class="informaltable"><table class="table">
795<colgroup>
796<col>
797<col>
798<col>
799<col>
800<col>
801</colgroup>
802<thead><tr>
803<th>
804                  <p>
805                    Name
806                  </p>
807                </th>
808<th>
809                  <p>
810                    kind
811                  </p>
812                </th>
813<th>
814                  <p>
815                    Description
816                  </p>
817                </th>
818<th>
819                  <p>
820                    Result
821                  </p>
822                </th>
823<th>
824                  <p>
825                    Ticket
826                  </p>
827                </th>
828</tr></thead>
829<tbody>
830<tr>
831<td>
832                  <p>
833                    typedefs.pass
834                  </p>
835                </td>
836<td>
837                  <p>
838                    run
839                  </p>
840                </td>
841<td>
842                  <p>
843                    check the num/den are correct for the predefined typedefs
844                  </p>
845                </td>
846<td>
847                  <p>
848                    Pass
849                  </p>
850                </td>
851<td>
852                  <p>
853                    #
854                  </p>
855                </td>
856</tr>
857<tr>
858<td>
859                  <p>
860                    ratio.pass
861                  </p>
862                </td>
863<td>
864                  <p>
865                    run
866                  </p>
867                </td>
868<td>
869                  <p>
870                    check the num/den are correctly simplified
871                  </p>
872                </td>
873<td>
874                  <p>
875                    Pass
876                  </p>
877                </td>
878<td>
879                  <p>
880                    #
881                  </p>
882                </td>
883</tr>
884<tr>
885<td>
886                  <p>
887                    ratio1.fail
888                  </p>
889                </td>
890<td>
891                  <p>
892                    compile-fails
893                  </p>
894                </td>
895<td>
896                  <p>
897                    The template argument D shall not be zero
898                  </p>
899                </td>
900<td>
901                  <p>
902                    Pass
903                  </p>
904                </td>
905<td>
906                  <p>
907                    #
908                  </p>
909                </td>
910</tr>
911<tr>
912<td>
913                  <p>
914                    ratio2.fail
915                  </p>
916                </td>
917<td>
918                  <p>
919                    compile-fails
920                  </p>
921                </td>
922<td>
923                  <p>
924                    the absolute values of the template arguments N and D shall be
925                    representable by type intmax_t
926                  </p>
927                </td>
928<td>
929                  <p>
930                    Pass
931                  </p>
932                </td>
933<td>
934                  <p>
935                    #
936                  </p>
937                </td>
938</tr>
939<tr>
940<td>
941                  <p>
942                    ratio3.fail
943                  </p>
944                </td>
945<td>
946                  <p>
947                    compile-fails
948                  </p>
949                </td>
950<td>
951                  <p>
952                    the absolute values of the template arguments N and D shall be
953                    representable by type intmax_t
954                  </p>
955                </td>
956<td>
957                  <p>
958                    Pass
959                  </p>
960                </td>
961<td>
962                  <p>
963                    #
964                  </p>
965                </td>
966</tr>
967</tbody>
968</table></div>
969</div>
970<div class="section">
971<div class="titlepage"><div><div><h4 class="title">
972<a name="ratio.appendices.tests._comparison_"></a><a class="link" href="appendices.html#ratio.appendices.tests._comparison_" title="comparison"><code class="computeroutput"><span class="identifier">comparison</span></code></a>
973</h4></div></div></div>
974<div class="informaltable"><table class="table">
975<colgroup>
976<col>
977<col>
978<col>
979<col>
980<col>
981</colgroup>
982<thead><tr>
983<th>
984                  <p>
985                    Name
986                  </p>
987                </th>
988<th>
989                  <p>
990                    kind
991                  </p>
992                </th>
993<th>
994                  <p>
995                    Description
996                  </p>
997                </th>
998<th>
999                  <p>
1000                    Result
1001                  </p>
1002                </th>
1003<th>
1004                  <p>
1005                    Ticket
1006                  </p>
1007                </th>
1008</tr></thead>
1009<tbody>
1010<tr>
1011<td>
1012                  <p>
1013                    ratio_equal.pass
1014                  </p>
1015                </td>
1016<td>
1017                  <p>
1018                    run
1019                  </p>
1020                </td>
1021<td>
1022                  <p>
1023                    check ratio_equal metafunction class
1024                  </p>
1025                </td>
1026<td>
1027                  <p>
1028                    Pass
1029                  </p>
1030                </td>
1031<td>
1032                  <p>
1033                    #
1034                  </p>
1035                </td>
1036</tr>
1037<tr>
1038<td>
1039                  <p>
1040                    ratio_not_equal.pass
1041                  </p>
1042                </td>
1043<td>
1044                  <p>
1045                    run
1046                  </p>
1047                </td>
1048<td>
1049                  <p>
1050                    check ratio_not_equal metafunction class
1051                  </p>
1052                </td>
1053<td>
1054                  <p>
1055                    Pass
1056                  </p>
1057                </td>
1058<td>
1059                  <p>
1060                    #
1061                  </p>
1062                </td>
1063</tr>
1064<tr>
1065<td>
1066                  <p>
1067                    ratio_less.pass
1068                  </p>
1069                </td>
1070<td>
1071                  <p>
1072                    run
1073                  </p>
1074                </td>
1075<td>
1076                  <p>
1077                    check ratio_less metafunction class
1078                  </p>
1079                </td>
1080<td>
1081                  <p>
1082                    Pass
1083                  </p>
1084                </td>
1085<td>
1086                  <p>
1087                    #
1088                  </p>
1089                </td>
1090</tr>
1091<tr>
1092<td>
1093                  <p>
1094                    ratio_less_equal.pass
1095                  </p>
1096                </td>
1097<td>
1098                  <p>
1099                    run
1100                  </p>
1101                </td>
1102<td>
1103                  <p>
1104                    check ratio_less_equal metafunction class
1105                  </p>
1106                </td>
1107<td>
1108                  <p>
1109                    Pass
1110                  </p>
1111                </td>
1112<td>
1113                  <p>
1114                    #
1115                  </p>
1116                </td>
1117</tr>
1118<tr>
1119<td>
1120                  <p>
1121                    ratio_greater.pass
1122                  </p>
1123                </td>
1124<td>
1125                  <p>
1126                    run
1127                  </p>
1128                </td>
1129<td>
1130                  <p>
1131                    check ratio_greater metafunction class
1132                  </p>
1133                </td>
1134<td>
1135                  <p>
1136                    Pass
1137                  </p>
1138                </td>
1139<td>
1140                  <p>
1141                    #
1142                  </p>
1143                </td>
1144</tr>
1145<tr>
1146<td>
1147                  <p>
1148                    ratio_greater_equal.pass
1149                  </p>
1150                </td>
1151<td>
1152                  <p>
1153                    run
1154                  </p>
1155                </td>
1156<td>
1157                  <p>
1158                    check ratio_greater_equal metafunction class
1159                  </p>
1160                </td>
1161<td>
1162                  <p>
1163                    Pass
1164                  </p>
1165                </td>
1166<td>
1167                  <p>
1168                    #
1169                  </p>
1170                </td>
1171</tr>
1172</tbody>
1173</table></div>
1174</div>
1175<div class="section">
1176<div class="titlepage"><div><div><h4 class="title">
1177<a name="ratio.appendices.tests._arithmetic_"></a><a class="link" href="appendices.html#ratio.appendices.tests._arithmetic_" title="arithmetic"><code class="computeroutput"><span class="identifier">arithmetic</span></code></a>
1178</h4></div></div></div>
1179<div class="informaltable"><table class="table">
1180<colgroup>
1181<col>
1182<col>
1183<col>
1184<col>
1185<col>
1186</colgroup>
1187<thead><tr>
1188<th>
1189                  <p>
1190                    Name
1191                  </p>
1192                </th>
1193<th>
1194                  <p>
1195                    kind
1196                  </p>
1197                </th>
1198<th>
1199                  <p>
1200                    Description
1201                  </p>
1202                </th>
1203<th>
1204                  <p>
1205                    Result
1206                  </p>
1207                </th>
1208<th>
1209                  <p>
1210                    Ticket
1211                  </p>
1212                </th>
1213</tr></thead>
1214<tbody>
1215<tr>
1216<td>
1217                  <p>
1218                    ratio_add.pass
1219                  </p>
1220                </td>
1221<td>
1222                  <p>
1223                    run
1224                  </p>
1225                </td>
1226<td>
1227                  <p>
1228                    check ratio_add metafunction class
1229                  </p>
1230                </td>
1231<td>
1232                  <p>
1233                    Pass
1234                  </p>
1235                </td>
1236<td>
1237                  <p>
1238                    #
1239                  </p>
1240                </td>
1241</tr>
1242<tr>
1243<td>
1244                  <p>
1245                    ratio_subtract.pass
1246                  </p>
1247                </td>
1248<td>
1249                  <p>
1250                    run
1251                  </p>
1252                </td>
1253<td>
1254                  <p>
1255                    check ratio_subtract metafunction class
1256                  </p>
1257                </td>
1258<td>
1259                  <p>
1260                    Pass
1261                  </p>
1262                </td>
1263<td>
1264                  <p>
1265                    #
1266                  </p>
1267                </td>
1268</tr>
1269<tr>
1270<td>
1271                  <p>
1272                    ratio_multiply.pass
1273                  </p>
1274                </td>
1275<td>
1276                  <p>
1277                    run
1278                  </p>
1279                </td>
1280<td>
1281                  <p>
1282                    check ratio_multiply metafunction class
1283                  </p>
1284                </td>
1285<td>
1286                  <p>
1287                    Pass
1288                  </p>
1289                </td>
1290<td>
1291                  <p>
1292                    #
1293                  </p>
1294                </td>
1295</tr>
1296<tr>
1297<td>
1298                  <p>
1299                    ratio_divide.pass
1300                  </p>
1301                </td>
1302<td>
1303                  <p>
1304                    run
1305                  </p>
1306                </td>
1307<td>
1308                  <p>
1309                    check ratio_divide metafunction class
1310                  </p>
1311                </td>
1312<td>
1313                  <p>
1314                    Pass
1315                  </p>
1316                </td>
1317<td>
1318                  <p>
1319                    #
1320                  </p>
1321                </td>
1322</tr>
1323<tr>
1324<td>
1325                  <p>
1326                    ratio_add.fail
1327                  </p>
1328                </td>
1329<td>
1330                  <p>
1331                    compile-fails
1332                  </p>
1333                </td>
1334<td>
1335                  <p>
1336                    check ratio_add overflow metafunction class
1337                  </p>
1338                </td>
1339<td>
1340                  <p>
1341                    Pass
1342                  </p>
1343                </td>
1344<td>
1345                  <p>
1346                    #
1347                  </p>
1348                </td>
1349</tr>
1350<tr>
1351<td>
1352                  <p>
1353                    ratio_subtract.fail
1354                  </p>
1355                </td>
1356<td>
1357                  <p>
1358                    compile-fails
1359                  </p>
1360                </td>
1361<td>
1362                  <p>
1363                    check ratio_subtract underflow metafunction class
1364                  </p>
1365                </td>
1366<td>
1367                  <p>
1368                    Pass
1369                  </p>
1370                </td>
1371<td>
1372                  <p>
1373                    #
1374                  </p>
1375                </td>
1376</tr>
1377<tr>
1378<td>
1379                  <p>
1380                    ratio_multiply.fail
1381                  </p>
1382                </td>
1383<td>
1384                  <p>
1385                    compile-fails
1386                  </p>
1387                </td>
1388<td>
1389                  <p>
1390                    check ratio_multiply overflow metafunction class
1391                  </p>
1392                </td>
1393<td>
1394                  <p>
1395                    Pass
1396                  </p>
1397                </td>
1398<td>
1399                  <p>
1400                    #
1401                  </p>
1402                </td>
1403</tr>
1404<tr>
1405<td>
1406                  <p>
1407                    ratio_divide.fail
1408                  </p>
1409                </td>
1410<td>
1411                  <p>
1412                    compile-fails
1413                  </p>
1414                </td>
1415<td>
1416                  <p>
1417                    check ratio_divide overflow metafunction class
1418                  </p>
1419                </td>
1420<td>
1421                  <p>
1422                    Pass
1423                  </p>
1424                </td>
1425<td>
1426                  <p>
1427                    #
1428                  </p>
1429                </td>
1430</tr>
1431</tbody>
1432</table></div>
1433</div>
1434</div>
1435<div class="section">
1436<div class="titlepage"><div><div><h3 class="title">
1437<a name="ratio.appendices.tickets"></a><a class="link" href="appendices.html#ratio.appendices.tickets" title="Appendix G: Tickets">Appendix G: Tickets</a>
1438</h3></div></div></div>
1439<div class="informaltable"><table class="table">
1440<colgroup>
1441<col>
1442<col>
1443<col>
1444<col>
1445</colgroup>
1446<thead><tr>
1447<th>
1448                <p>
1449                  Ticket
1450                </p>
1451              </th>
1452<th>
1453                <p>
1454                  Description
1455                </p>
1456              </th>
1457<th>
1458                <p>
1459                  Resolution
1460                </p>
1461              </th>
1462<th>
1463                <p>
1464                  State
1465                </p>
1466              </th>
1467</tr></thead>
1468<tbody>
1469<tr>
1470<td>
1471                <p>
1472                  1
1473                </p>
1474              </td>
1475<td>
1476                <p>
1477                  result of metafunctions ratio_multiply and ratio_divide were not
1478                  normalized ratios.
1479                </p>
1480              </td>
1481<td>
1482                <p>
1483                  Use of the nested ratio typedef type on ratio arithmetic operations.
1484                </p>
1485              </td>
1486<td>
1487                <p>
1488                  Closed
1489                </p>
1490              </td>
1491</tr>
1492<tr>
1493<td>
1494                <p>
1495                  2
1496                </p>
1497              </td>
1498<td>
1499                <p>
1500                  INTMAX_C is not always defined.
1501                </p>
1502              </td>
1503<td>
1504                <p>
1505                  Replace INTMAX_C by BOOST_INTMAX_C until boost/cstdint.hpp ensures
1506                  INTMAX_C is always defined.
1507                </p>
1508              </td>
1509<td>
1510                <p>
1511                  Closed
1512                </p>
1513              </td>
1514</tr>
1515<tr>
1516<td>
1517                <p>
1518                  3
1519                </p>
1520              </td>
1521<td>
1522                <p>
1523                  MSVC reports a warning instead of an error when there is an integral
1524                  constant overflow.
1525                </p>
1526              </td>
1527<td>
1528                <p>
1529                  manage with MSVC reporting a warning instead of an error when there
1530                  is an integral constant overflow.
1531                </p>
1532              </td>
1533<td>
1534                <p>
1535                  Closed
1536                </p>
1537              </td>
1538</tr>
1539<tr>
1540<td>
1541                <p>
1542                  4
1543                </p>
1544              </td>
1545<td>
1546                <p>
1547                  ration_less overflow on cases where it can be avoided.
1548                </p>
1549              </td>
1550<td>
1551                <p>
1552                  Change the algorithm as implemented in libc++.
1553                </p>
1554              </td>
1555<td>
1556                <p>
1557                  Closed
1558                </p>
1559              </td>
1560</tr>
1561</tbody>
1562</table></div>
1563</div>
1564<div class="section">
1565<div class="titlepage"><div><div><h3 class="title">
1566<a name="ratio.appendices.todo"></a><a class="link" href="appendices.html#ratio.appendices.todo" title="Appendix H: Future Plans">Appendix H: Future Plans</a>
1567</h3></div></div></div>
1568<h5>
1569<a name="ratio.appendices.todo.h0"></a>
1570        <span class="phrase"><a name="ratio.appendices.todo.for_later_releases"></a></span><a class="link" href="appendices.html#ratio.appendices.todo.for_later_releases">For
1571        later releases</a>
1572      </h5>
1573<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1574<li class="listitem">
1575            Use template aliases on compiler providing it.
1576          </li>
1577<li class="listitem">
1578            Implement <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3135.html#3135" target="_top">multiple
1579            arguments</a> ratio arithmetic.
1580          </li>
1581</ul></div>
1582</div>
1583</div>
1584<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1585<td align="left"></td>
1586<td align="right"><div class="copyright-footer">Copyright © 2008 Howard Hinnant<br>Copyright © 2006, 2008 Beman Dawes<br>Copyright © 2009-2012 Vicente
1587      J. Botet Escriba<p>
1588        Distributed under the Boost Software License, Version 1.0. (See accompanying
1589        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>)
1590      </p>
1591</div></td>
1592</tr></table>
1593<hr>
1594<div class="spirit-nav">
1595<a accesskey="p" href="reference.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../ratio.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="../signals2.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
1596</div>
1597</body>
1598</html>
1599