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: '<<' : 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<>::short_name and ratio_string<>::long_name 104 are deprecated. Use ratio_string<>::symbol and ratio_string<>::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<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special"><</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">></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<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special"><</span><span class="number">3</span><span class="special">,</span><span class="number">9</span><span class="special">></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<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special"><</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">></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"><</span><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special"><</span><span class="number">2</span><span class="special">,</span><span class="number">3</span><span class="special">>,</span><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special"><</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">></span> <span class="special">></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"><</span><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special"><</span><span class="number">2</span><span class="special">,</span><span class="number">3</span><span class="special">>,</span><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special"><</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">></span> <span class="special">></span></code> 242 could be <code class="computeroutput"><a class="link" href="reference.html#ratio.reference.std.ratio_hpp.ratio" title="Class Template ratio<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><span class="special"><</span><span class="number">3</span><span class="special">,</span><span class="number">9</span><span class="special">></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<>"><code class="computeroutput"><span class="identifier">ratio</span></code></a><1,3> 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"><</span><span class="identifier">ratio</span><span class="special"><</span><span class="identifier">INTMAX_MAX</span><span class="special">,</span><span class="number">2</span><span class="special">>,</span><span class="identifier">ratio</span><span class="special"><</span><span class="number">2</span><span class="special">,</span><span class="identifier">INTMAX_MAX</span><span class="special">>></span></code> can be reduced to <code class="computeroutput"><span class="identifier">ratio</span><span class="special"><</span><span class="number">1</span><span class="special">,</span><span class="number">1</span><span class="special">></span></code>, but 269 the direct result of <code class="computeroutput"><span class="identifier">ratio</span><span class="special"><</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">></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"><></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">)<(</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) < 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"><</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">)<(</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">)<(</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">))<((</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"><</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"><</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"><</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"><</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) <1 because Mi<di. 473 </p> 474<p> 475 if Q1>Q2, Q1==Q2+k, k>=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"><</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"><</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"><</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>Q1, Q2==Q1+k, k>=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"><</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"><</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"><</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<n1,d1> 512 </p> 513 </th> 514<th> 515 <p> 516 ratio<n2,d2> 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<n1,d1> 550 </p> 551 </td> 552<td> 553 <p> 554 ratio<n2,d2> 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 < Q2 580 </p> 581 </td> 582</tr> 583<tr> 584<td> 585 <p> 586 ratio<n1,d1> 587 </p> 588 </td> 589<td> 590 <p> 591 ratio<n2,d2> 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<n1,d1> 624 </p> 625 </td> 626<td> 627 <p> 628 ratio<n2,d2> 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<n1,d1> 661 </p> 662 </td> 663<td> 664 <p> 665 ratio<n2,d2> 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<n1,d1> 698 </p> 699 </td> 700<td> 701 <p> 702 ratio<n2,d2> 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<ratio<d2,M2>, ratio<d1/M1>> 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"><</span><span class="identifier">ratio_io</span><span class="special">></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