Files
rippled/Number_8cpp_source.html
2026-01-28 10:13:01 -08:00

1354 lines
245 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>rippled: Number.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">rippled
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_90ffdbabf412cfdffe6b2193e0ce938a.html">libxrpl</a></li><li class="navelem"><a class="el" href="dir_c9ad8b908996c4ad90b9a0cfb3c90cd8.html">basics</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">Number.cpp</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="preprocessor">#include &lt;xrpl/basics/Number.h&gt;</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Keep Number.h first to ensure it can build without hidden dependencies</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="preprocessor">#include &lt;xrpl/basics/contract.h&gt;</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &lt;xrpl/beast/utility/instrumentation.h&gt;</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span> </div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/algorithm.html">algorithm</a>&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/cstddef.html">cstddef</a>&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/cstdint.html">cstdint</a>&gt;</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/iterator.html">iterator</a>&gt;</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/limits.html">limits</a>&gt;</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/numeric.html">numeric</a>&gt;</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/stdexcept.html">stdexcept</a>&gt;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/string.html">string</a>&gt;</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/type_traits.html">type_traits</a>&gt;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/utility.html">utility</a>&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifdef _MSC_VER</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#pragma message(&quot;Using boost::multiprecision::uint128_t and int128_t&quot;)</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;boost/multiprecision/cpp_int.hpp&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="keyword">using </span>uint128_t = boost::multiprecision::uint128_t;</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="keyword">using </span>int128_t = boost::multiprecision::int128_t;</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#else </span><span class="comment">// !defined(_MSC_VER)</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="keyword">using </span>uint128_t = __uint128_t;</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="keyword">using </span>int128_t = __int128_t;</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#endif </span><span class="comment">// !defined(_MSC_VER)</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexrpl.html">xrpl</a> {</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="keyword">thread_local</span> <a class="code hl_enumeration" href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95">Number::rounding_mode</a> <a class="code hl_variable" href="classxrpl_1_1Number.html#a73b1712a4714d18b02c0b9158a3ac201">Number::mode_</a> = <a class="code hl_enumvalue" href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95aa1683b7e2939668142366896b111931a">Number::to_nearest</a>;</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="keyword">thread_local</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper.html">std::reference_wrapper&lt;MantissaRange const&gt;</a> <a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">Number::range_</a> = largeRange;</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><a class="code hl_enumeration" href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95">Number::rounding_mode</a></div>
<div class="foldopen" id="foldopen00033" data-start="{" data-end="}">
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a0c71d26d6de400ed12cf3923157aca31"> 33</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a0c71d26d6de400ed12cf3923157aca31">Number::getround</a>()</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span>{</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a73b1712a4714d18b02c0b9158a3ac201">mode_</a>;</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span>}</div>
</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><a class="code hl_enumeration" href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95">Number::rounding_mode</a></div>
<div class="foldopen" id="foldopen00039" data-start="{" data-end="}">
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a274b459d7478df80795caed8a56d4f00"> 39</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a274b459d7478df80795caed8a56d4f00">Number::setround</a>(<a class="code hl_enumeration" href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95">rounding_mode</a> mode)</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span>{</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="keywordflow">return</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/utility/exchange.html">std::exchange</a>(<a class="code hl_variable" href="classxrpl_1_1Number.html#a73b1712a4714d18b02c0b9158a3ac201">mode_</a>, mode);</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span>}</div>
</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> </div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><a class="code hl_enumeration" href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2">MantissaRange::mantissa_scale</a></div>
<div class="foldopen" id="foldopen00045" data-start="{" data-end="}">
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#ac138187ff4d421f4158228642551756c"> 45</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#ac138187ff4d421f4158228642551756c">Number::getMantissaScale</a>()</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span>{</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">range_</a>.get().scale;</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span>}</div>
</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> </div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00051" data-start="{" data-end="}">
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a89a1e2cc1d2d69c86bbb03340284a6b7"> 51</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a89a1e2cc1d2d69c86bbb03340284a6b7">Number::setMantissaScale</a>(<a class="code hl_enumeration" href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2">MantissaRange::mantissa_scale</a> scale)</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span>{</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keywordflow">if</span> (scale != <a class="code hl_enumvalue" href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2a159d6fc6b77bffdac828a75a473aea42">MantissaRange::small</a> &amp;&amp; scale != <a class="code hl_enumvalue" href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2a0b64e613fbbea29706141a2e1a08ffa5">MantissaRange::large</a>)</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <a class="code hl_function" href="namespacexrpl.html#a16550239e117c441e0e17bd1c67beeba">LogicError</a>(<span class="stringliteral">&quot;Unknown mantissa scale&quot;</span>);</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">range_</a> = scale == <a class="code hl_enumvalue" href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2a159d6fc6b77bffdac828a75a473aea42">MantissaRange::small</a> ? <a class="code hl_variable" href="classxrpl_1_1Number.html#a484ed599d53a6c6f57cd6b6163dca4d6">smallRange</a> : <a class="code hl_variable" href="classxrpl_1_1Number.html#ace04e61c20eedabf3ead4454049d9126">largeRange</a>;</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span>}</div>
</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="comment">// Guard</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="comment">// The Guard class is used to temporarily add extra digits of</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="comment">// precision to an operation. This enables the final result</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="comment">// to be correctly rounded to the internal precision of Number.</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> </div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"><a class="line" href="conceptxrpl_1_1UnsignedMantissa.html"> 65</a></span><span class="keyword">concept </span><a class="code hl_concept" href="conceptxrpl_1_1UnsignedMantissa.html">UnsignedMantissa</a> = <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::is_unsigned_v&lt;T&gt;</a> || <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::is_same_v&lt;T, uint128_t&gt;</a>;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
<div class="foldopen" id="foldopen00067" data-start="{" data-end="};">
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html"> 67</a></span><span class="keyword">class </span><a class="code hl_class" href="classxrpl_1_1Number_1_1Guard.html">Number::Guard</a></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span>{</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e"> 69</a></span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a>; <span class="comment">// 16 decimal guard digits</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612"> 70</a></span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint8_t</a> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612">xbit_</a> : 1; <span class="comment">// has a non-zero digit been shifted off the end</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322"> 71</a></span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint8_t</a> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322">sbit_</a> : 1; <span class="comment">// the sign of the guard digits</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> </div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span><span class="keyword">public</span>:</div>
<div class="foldopen" id="foldopen00074" data-start="{" data-end="}">
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#ac3545d65922e16f7cd18897679a0466f"> 74</a></span> <span class="keyword">explicit</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#ac3545d65922e16f7cd18897679a0466f">Guard</a>() : <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a>{0}, <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612">xbit_</a>{0}, <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322">sbit_</a>{0}</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> {</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> }</div>
</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> </div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="comment">// set &amp; test the sign bit</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a11e2fc9dcf9120daa2ff1976ffd83278">set_positive</a>() noexcept;</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee">set_negative</a>() noexcept;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keywordtype">bool</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a56a81d86e08ba5f15554710ee6558f5d">is_negative</a>() const noexcept;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <span class="comment">// add a digit</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> template &lt;class T&gt;</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">push</a>(T d) noexcept;</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> </div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <span class="comment">// recover a digit</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keywordtype">unsigned</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a1977d28778524257f10ce34f95858840">pop</a>() noexcept;</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="comment">// Indicate round direction: 1 is up, -1 is down, 0 is even</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="comment">// This enables the client to round towards nearest, and on</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="comment">// tie, round towards even.</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keywordtype">int</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a0ebc09f6e6241ba83bec8d3268d50c31">round</a>() noexcept;</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="comment">// Modify the result to the correctly rounded value</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> template &lt;<a class="code hl_concept" href="conceptxrpl_1_1UnsignedMantissa.html">UnsignedMantissa</a> T&gt;</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a1c936cf21ec79609449a3868ca013c7f">doRoundUp</a>(</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordtype">bool</span>&amp; negative,</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> T&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>,</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>,</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> const&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>,</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> const&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>,</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <a class="code hl_namespace" href="namespacestd.html">std</a>::<span class="keywordtype">string</span> location);</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> </div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="comment">// Modify the result to the correctly rounded value</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> template &lt;<a class="code hl_concept" href="conceptxrpl_1_1UnsignedMantissa.html">UnsignedMantissa</a> T&gt;</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a587e49e00e7b5b36cb51a6b8df743c59">doRoundDown</a>(<span class="keywordtype">bool</span>&amp; negative, T&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> const&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>);</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="comment">// Modify the result to the correctly rounded value</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a55bc76505e3a34a0d50baa1c7eeae19c">doRound</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">rep</a>&amp; drops, <a class="code hl_namespace" href="namespacestd.html">std</a>::<span class="keywordtype">string</span> location);</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span>private:</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a7e98b203dc4370e448d1398ecdf05745">doPush</a>(<span class="keywordtype">unsigned</span> d) noexcept;</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> </div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> template &lt;<a class="code hl_concept" href="conceptxrpl_1_1UnsignedMantissa.html">UnsignedMantissa</a> T&gt;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a491b4ea2971fe0221fa0e61179154c6b">bringIntoRange</a>(<span class="keywordtype">bool</span>&amp; negative, T&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> const&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>);</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span>};</div>
</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> </div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span>inline <span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00131" data-start="{" data-end="}">
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a11e2fc9dcf9120daa2ff1976ffd83278"> 131</a></span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>::<a class="code hl_class" href="classxrpl_1_1Number_1_1Guard.html">Guard</a>::<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a11e2fc9dcf9120daa2ff1976ffd83278">set_positive</a>() noexcept</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span>{</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322">sbit_</a> = 0;</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span>}</div>
</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> </div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span><span class="keyword">inline</span> <span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00137" data-start="{" data-end="}">
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee"> 137</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee">Number::Guard::set_negative</a>() noexcept</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span>{</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322">sbit_</a> = 1;</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span>}</div>
</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span><span class="keyword">inline</span> <span class="keywordtype">bool</span></div>
<div class="foldopen" id="foldopen00143" data-start="{" data-end="}">
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a56a81d86e08ba5f15554710ee6558f5d"> 143</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a56a81d86e08ba5f15554710ee6558f5d">Number::Guard::is_negative</a>() const noexcept</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span>{</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322">sbit_</a> == 1;</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span>}</div>
</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span><span class="keyword">inline</span> <span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00149" data-start="{" data-end="}">
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a7e98b203dc4370e448d1398ecdf05745"> 149</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a7e98b203dc4370e448d1398ecdf05745">Number::Guard::doPush</a>(<span class="keywordtype">unsigned</span> d) <span class="keyword">noexcept</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span>{</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612">xbit_</a> = <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612">xbit_</a> || ((<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> &amp; 0x0000&#39;0000&#39;0000&#39;000F) != 0);</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> &gt;&gt;= 4;</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> |= (d &amp; 0x0000&#39;0000&#39;0000&#39;000FULL) &lt;&lt; 60;</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span>}</div>
</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span><span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span><span class="keyword">inline</span> <span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00158" data-start="{" data-end="}">
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363"> 158</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">Number::Guard::push</a>(T d) <span class="keyword">noexcept</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span>{</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a7e98b203dc4370e448d1398ecdf05745">doPush</a>(<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span><span class="keyword">&gt;</span>(d));</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span>}</div>
</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> </div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span><span class="keyword">inline</span> <span class="keywordtype">unsigned</span></div>
<div class="foldopen" id="foldopen00164" data-start="{" data-end="}">
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a1977d28778524257f10ce34f95858840"> 164</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a1977d28778524257f10ce34f95858840">Number::Guard::pop</a>() noexcept</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span>{</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keywordtype">unsigned</span> d = (<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> &amp; 0xF000&#39;0000&#39;0000&#39;0000) &gt;&gt; 60;</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> &lt;&lt;= 4;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keywordflow">return</span> d;</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span>}</div>
</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> </div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span><span class="comment">// Returns:</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span><span class="comment">// -1 if Guard is less than half</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span><span class="comment">// 0 if Guard is exactly half</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span><span class="comment">// 1 if Guard is greater than half</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span><span class="keywordtype">int</span></div>
<div class="foldopen" id="foldopen00176" data-start="{" data-end="}">
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a0ebc09f6e6241ba83bec8d3268d50c31"> 176</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a0ebc09f6e6241ba83bec8d3268d50c31">Number::Guard::round</a>() noexcept</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span>{</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keyword">auto</span> mode = <a class="code hl_function" href="classxrpl_1_1Number.html#a0c71d26d6de400ed12cf3923157aca31">Number::getround</a>();</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> </div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="keywordflow">if</span> (mode == <a class="code hl_enumvalue" href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95aa0120ec63f8c549bc0bf1c945e36e779">towards_zero</a>)</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> </div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keywordflow">if</span> (mode == <a class="code hl_enumvalue" href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95aefac6c5bd63a85dcee4fc69baf788d40">downward</a>)</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> {</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322">sbit_</a>)</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> {</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> &gt; 0 || <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612">xbit_</a>)</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> <span class="keywordflow">return</span> 1;</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> }</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> }</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> </div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="keywordflow">if</span> (mode == <a class="code hl_enumvalue" href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95aaf71effcd4dcf7bc7c89bb51e27e8b17">upward</a>)</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> {</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322">sbit_</a>)</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> &gt; 0 || <a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612">xbit_</a>)</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keywordflow">return</span> 1;</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> }</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> </div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="comment">// assume round to nearest if mode is not one of the predefined values</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> &gt; 0x5000&#39;0000&#39;0000&#39;0000)</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordflow">return</span> 1;</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">digits_</a> &lt; 0x5000&#39;0000&#39;0000&#39;0000)</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612">xbit_</a>)</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keywordflow">return</span> 1;</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span>}</div>
</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> </div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span><span class="keyword">template</span> &lt;Un<span class="keywordtype">signed</span>Mantissa T&gt;</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00214" data-start="{" data-end="}">
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a491b4ea2971fe0221fa0e61179154c6b"> 214</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a491b4ea2971fe0221fa0e61179154c6b">Number::Guard::bringIntoRange</a>(<span class="keywordtype">bool</span>&amp; negative, T&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>)</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span>{</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="comment">// Bring mantissa back into the minMantissa / maxMantissa range AFTER</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="comment">// rounding</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> &lt; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>)</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> {</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> *= 10;</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> --<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>;</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> }</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> &lt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a7cf828e636abd921b2ff2bca7a7bc8b8">minExponent</a>)</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> {</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> </div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> negative = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> }</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span>}</div>
</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> </div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span><span class="keyword">template</span> &lt;Un<span class="keywordtype">signed</span>Mantissa T&gt;</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00235" data-start="{" data-end="}">
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a1c936cf21ec79609449a3868ca013c7f"> 235</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a1c936cf21ec79609449a3868ca013c7f">Number::Guard::doRoundUp</a>(</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keywordtype">bool</span>&amp; negative,</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> T&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>,</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>,</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>,</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>,</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> location)</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span>{</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="keyword">auto</span> r = <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a0ebc09f6e6241ba83bec8d3268d50c31">round</a>();</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keywordflow">if</span> (r == 1 || (r == 0 &amp;&amp; (<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> &amp; 1) == 1))</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> {</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> ++<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>;</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="comment">// Ensure mantissa after incrementing fits within both the</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <span class="comment">// min/maxMantissa range and is a valid &quot;rep&quot;.</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> &gt; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a> || <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> &gt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a>)</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> {</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> /= 10;</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> ++<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> }</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> }</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a491b4ea2971fe0221fa0e61179154c6b">bringIntoRange</a>(negative, <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>);</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> &gt; <a class="code hl_variable" href="classxrpl_1_1Number.html#aa41a4f7784291ffd76634c7fc567f6fb">maxExponent</a>)</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(location);</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span>}</div>
</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> </div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span><span class="keyword">template</span> &lt;Un<span class="keywordtype">signed</span>Mantissa T&gt;</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00262" data-start="{" data-end="}">
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a587e49e00e7b5b36cb51a6b8df743c59"> 262</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a587e49e00e7b5b36cb51a6b8df743c59">Number::Guard::doRoundDown</a>(<span class="keywordtype">bool</span>&amp; negative, T&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>)</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span>{</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <span class="keyword">auto</span> r = <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a0ebc09f6e6241ba83bec8d3268d50c31">round</a>();</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> <span class="keywordflow">if</span> (r == 1 || (r == 0 &amp;&amp; (<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> &amp; 1) == 1))</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> {</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> --<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>;</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> &lt; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>)</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> {</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> *= 10;</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> --<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>;</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> }</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> }</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a491b4ea2971fe0221fa0e61179154c6b">bringIntoRange</a>(negative, <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>);</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span>}</div>
</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> </div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span><span class="comment">// Modify the result to the correctly rounded value</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00279" data-start="{" data-end="}">
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number_1_1Guard.html#a55bc76505e3a34a0d50baa1c7eeae19c"> 279</a></span><a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a55bc76505e3a34a0d50baa1c7eeae19c">Number::Guard::doRound</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">rep</a>&amp; drops, <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> location)</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span>{</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="keyword">auto</span> r = <a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a0ebc09f6e6241ba83bec8d3268d50c31">round</a>();</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="keywordflow">if</span> (r == 1 || (r == 0 &amp;&amp; (drops &amp; 1) == 1))</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> {</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="keywordflow">if</span> (drops &gt;= <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a>)</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> {</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> <span class="keyword">static_assert</span>(<span class="keyword">sizeof</span>(<a class="code hl_typedef" href="classxrpl_1_1Number.html#a67e66cfedbb2ff6c670917e4872da14f">internalrep</a>) == <span class="keyword">sizeof</span>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">rep</a>));</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <span class="comment">// This should be impossible, because it&#39;s impossible to represent</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <span class="comment">// &quot;maxRep + 0.6&quot; in Number, regardless of the scale. There aren&#39;t</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <span class="comment">// enough digits available. You&#39;d either get a mantissa of &quot;maxRep&quot;</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <span class="comment">// or &quot;(maxRep + 1) / 10&quot;, neither of which will round up when</span></div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> <span class="comment">// converting to rep, though the latter might overflow _before_</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="comment">// rounding.</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(location); <span class="comment">// LCOV_EXCL_LINE</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> }</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> ++drops;</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> }</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a56a81d86e08ba5f15554710ee6558f5d">is_negative</a>())</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> drops = -drops;</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span>}</div>
</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> </div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span><span class="comment">// Number</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> </div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span><span class="comment">// Safely convert rep (int64) mantissa to internalrep (uint64). If the rep is</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span><span class="comment">// negative, returns the positive value. This takes a little extra work because</span></div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span><span class="comment">// converting std::numeric_limits&lt;std::int64_t&gt;::min() flirts with UB, and can</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span><span class="comment">// vary across compilers.</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">Number::internalrep</a></div>
<div class="foldopen" id="foldopen00308" data-start="{" data-end="}">
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a966f5eca09ff61f50f0c377dea86c798"> 308</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a966f5eca09ff61f50f0c377dea86c798">Number::externalToInternal</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">rep</a> <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>)</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span>{</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="comment">// If the mantissa is already positive, just return it</span></div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> &gt;= 0)</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>;</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="comment">// If the mantissa is negative, but fits within the positive range of rep,</span></div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> <span class="comment">// return it negated</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> &gt;= -<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/numeric_limits.html">std::numeric_limits&lt;rep&gt;::max</a>())</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <span class="keywordflow">return</span> -<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>;</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> </div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <span class="comment">// If the mantissa doesn&#39;t fit within the positive range, convert to</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="comment">// int128_t, negate that, and cast it back down to the internalrep</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="comment">// In practice, this is only going to cover the case of</span></div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <span class="comment">// std::numeric_limits&lt;rep&gt;::min().</span></div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> int128_t temp = <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>;</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a><span class="keyword">&gt;</span>(-temp);</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span>}</div>
</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> </div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span><span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a></div>
<div class="foldopen" id="foldopen00327" data-start="{" data-end="}">
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a0981e6287c63318941d3b12d5c51c419"> 327</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a0981e6287c63318941d3b12d5c51c419">Number::oneSmall</a>()</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span>{</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> <span class="keywordflow">return</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{<span class="keyword">false</span>, <a class="code hl_variable" href="classxrpl_1_1Number.html#a484ed599d53a6c6f57cd6b6163dca4d6">Number::smallRange</a>.<a class="code hl_variable" href="structxrpl_1_1MantissaRange.html#a6e5cafa1836416d4069e77a8fb54363c">min</a>, -<a class="code hl_variable" href="classxrpl_1_1Number.html#a484ed599d53a6c6f57cd6b6163dca4d6">Number::smallRange</a>.<a class="code hl_variable" href="structxrpl_1_1MantissaRange.html#aea1c72494866d67e120bd23737080a7e">log</a>, <a class="code hl_struct" href="structxrpl_1_1Number_1_1unchecked.html">Number::unchecked</a>{}};</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span>};</div>
</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> </div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"><a class="line" href="namespacexrpl.html#a8b5241821c12fc02371c08f79f642801"> 332</a></span><span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <a class="code hl_variable" href="namespacexrpl.html#a8b5241821c12fc02371c08f79f642801">oneSml</a> = <a class="code hl_function" href="classxrpl_1_1Number.html#a0981e6287c63318941d3b12d5c51c419">Number::oneSmall</a>();</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> </div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span><span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a></div>
<div class="foldopen" id="foldopen00335" data-start="{" data-end="}">
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#ae07fcd3fb3a2d61a8c4491e43c3d99b2"> 335</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#ae07fcd3fb3a2d61a8c4491e43c3d99b2">Number::oneLarge</a>()</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span>{</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> <span class="keywordflow">return</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{<span class="keyword">false</span>, <a class="code hl_variable" href="classxrpl_1_1Number.html#ace04e61c20eedabf3ead4454049d9126">Number::largeRange</a>.<a class="code hl_variable" href="structxrpl_1_1MantissaRange.html#a6e5cafa1836416d4069e77a8fb54363c">min</a>, -<a class="code hl_variable" href="classxrpl_1_1Number.html#ace04e61c20eedabf3ead4454049d9126">Number::largeRange</a>.<a class="code hl_variable" href="structxrpl_1_1MantissaRange.html#aea1c72494866d67e120bd23737080a7e">log</a>, <a class="code hl_struct" href="structxrpl_1_1Number_1_1unchecked.html">Number::unchecked</a>{}};</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span>};</div>
</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> </div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"><a class="line" href="namespacexrpl.html#ac8b787145f3e674ee3c180e784f42142"> 340</a></span><span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <a class="code hl_variable" href="namespacexrpl.html#ac8b787145f3e674ee3c180e784f42142">oneLrg</a> = <a class="code hl_function" href="classxrpl_1_1Number.html#ae07fcd3fb3a2d61a8c4491e43c3d99b2">Number::oneLarge</a>();</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> </div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a></div>
<div class="foldopen" id="foldopen00343" data-start="{" data-end="}">
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2"> 343</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">Number::one</a>()</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span>{</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> <span class="keywordflow">if</span> (&amp;<a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">range_</a>.get() == &amp;<a class="code hl_variable" href="classxrpl_1_1Number.html#a484ed599d53a6c6f57cd6b6163dca4d6">smallRange</a>)</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="namespacexrpl.html#a8b5241821c12fc02371c08f79f642801">oneSml</a>;</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> XRPL_ASSERT(&amp;<a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">range_</a>.get() == &amp;<a class="code hl_variable" href="classxrpl_1_1Number.html#ace04e61c20eedabf3ead4454049d9126">largeRange</a>, <span class="stringliteral">&quot;Number::one() : valid range_&quot;</span>);</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="namespacexrpl.html#ac8b787145f3e674ee3c180e784f42142">oneLrg</a>;</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span>}</div>
</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> </div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span><span class="comment">// Use the member names in this static function for now so the diff is cleaner</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span><span class="comment">// TODO: Rename the function parameters to get rid of the &quot;_&quot; suffix</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span><span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00355" data-start="{" data-end="};">
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a4f3e98cecc5435852a47d61a2d80d02f"> 355</a></span><a class="code hl_friend" href="classxrpl_1_1Number.html#a4f3e98cecc5435852a47d61a2d80d02f">doNormalize</a>(</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> <span class="keywordtype">bool</span>&amp; negative,</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> T&amp; <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>,</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> <span class="keywordtype">int</span>&amp; <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>,</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">MantissaRange::rep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>,</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">MantissaRange::rep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>)</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span>{</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> <span class="keyword">auto</span> <span class="keyword">constexpr</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a7cf828e636abd921b2ff2bca7a7bc8b8">minExponent</a> = <a class="code hl_variable" href="classxrpl_1_1Number.html#a7cf828e636abd921b2ff2bca7a7bc8b8">Number::minExponent</a>;</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> <span class="keyword">auto</span> <span class="keyword">constexpr</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#aa41a4f7784291ffd76634c7fc567f6fb">maxExponent</a> = <a class="code hl_variable" href="classxrpl_1_1Number.html#aa41a4f7784291ffd76634c7fc567f6fb">Number::maxExponent</a>;</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <span class="keyword">auto</span> <span class="keyword">constexpr</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a> = <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">Number::maxRep</a>;</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> </div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> <span class="keyword">using </span><a class="code hl_class" href="classxrpl_1_1Number_1_1Guard.html">Guard</a> = <a class="code hl_class" href="classxrpl_1_1Number_1_1Guard.html">Number::Guard</a>;</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> </div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> == 0)</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> {</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> negative = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> }</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> <span class="keyword">auto</span> m = <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> <span class="keywordflow">while</span> ((m &lt; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>) &amp;&amp; (<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> &gt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a7cf828e636abd921b2ff2bca7a7bc8b8">minExponent</a>))</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> {</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> m *= 10;</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> --<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> }</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> <a class="code hl_class" href="classxrpl_1_1Number_1_1Guard.html">Guard</a> g;</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> <span class="keywordflow">if</span> (negative)</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee">set_negative</a>();</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> <span class="keywordflow">while</span> (m &gt; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>)</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> {</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> &gt;= <a class="code hl_variable" href="classxrpl_1_1Number.html#aa41a4f7784291ffd76634c7fc567f6fb">maxExponent</a>)</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::normalize 1&quot;</span>);</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">push</a>(m % 10);</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> m /= 10;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> ++<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> }</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> <span class="keywordflow">if</span> ((<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> &lt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a7cf828e636abd921b2ff2bca7a7bc8b8">minExponent</a>) || (m &lt; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>))</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> {</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> negative = zero.<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> }</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> </div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> <span class="comment">// When using the largeRange, &quot;m&quot; needs fit within an int64, even if</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> <span class="comment">// the final mantissa_ is going to end up larger to fit within the</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> <span class="comment">// MantissaRange. Cut it down here so that the rounding will be done while</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> <span class="comment">// it&#39;s smaller.</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <span class="comment">//</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> <span class="comment">// Example: 9,900,000,000,000,123,456 &gt; 9,223,372,036,854,775,807,</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> <span class="comment">// so &quot;m&quot; will be modified to 990,000,000,000,012,345. Then that value</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="comment">// will be rounded to 990,000,000,000,012,345 or</span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> <span class="comment">// 990,000,000,000,012,346, depending on the rounding mode. Finally,</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> <span class="comment">// mantissa_ will be &quot;m*10&quot; so it fits within the range, and end up as</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> <span class="comment">// 9,900,000,000,000,123,450 or 9,900,000,000,000,123,460.</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> <span class="comment">// mantissa() will return mantissa_ / 10, and exponent() will return</span></div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> <span class="comment">// exponent_ + 1.</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="keywordflow">if</span> (m &gt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a>)</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> {</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> &gt;= <a class="code hl_variable" href="classxrpl_1_1Number.html#aa41a4f7784291ffd76634c7fc567f6fb">maxExponent</a>)</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::normalize 1.5&quot;</span>);</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">push</a>(m % 10);</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> m /= 10;</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> ++<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> }</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> <span class="comment">// Before modification, m should be within the min/max range. After</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <span class="comment">// modification, it must be less than maxRep. In other words, the original</span></div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> <span class="comment">// value should have been no more than maxRep * 10.</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> <span class="comment">// (maxRep * 10 &gt; maxMantissa)</span></div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> XRPL_ASSERT_PARTS(m &lt;= <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a>, <span class="stringliteral">&quot;xrpl::doNormalize&quot;</span>, <span class="stringliteral">&quot;intermediate mantissa fits in int64&quot;</span>);</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> = m;</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> </div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a1c936cf21ec79609449a3868ca013c7f">doRoundUp</a>(negative, <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>, <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>, <span class="stringliteral">&quot;Number::normalize 2&quot;</span>);</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> XRPL_ASSERT_PARTS(</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> &gt;= <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a> &amp;&amp; <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> &lt;= <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>, <span class="stringliteral">&quot;xrpl::doNormalize&quot;</span>, <span class="stringliteral">&quot;final mantissa fits in range&quot;</span>);</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span>}</div>
</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> </div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span><span class="keyword">template</span> &lt;&gt;</div>
<div class="foldopen" id="foldopen00435" data-start="{" data-end="}">
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a85a1f584e04ab4bd89d1f1e73a03dfd2"> 435</a></span><span class="keywordtype">void</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span>Number::normalize&lt;uint128_t&gt;(</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordtype">bool</span>&amp; negative,</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> uint128_t&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>,</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>,</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>,</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>)</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span>{</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> <a class="code hl_friend" href="classxrpl_1_1Number.html#a4f3e98cecc5435852a47d61a2d80d02f">doNormalize</a>(negative, <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>);</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span>}</div>
</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> </div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span><span class="keyword">template</span> &lt;&gt;</div>
<div class="foldopen" id="foldopen00447" data-start="{" data-end="}">
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a176c4c2727bbfcdfb6c9900142495dd3"> 447</a></span><span class="keywordtype">void</span></div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span>Number::normalize&lt;unsigned long long&gt;(</div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="keywordtype">bool</span>&amp; negative,</div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>,</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>,</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>,</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>)</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span>{</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <a class="code hl_friend" href="classxrpl_1_1Number.html#a4f3e98cecc5435852a47d61a2d80d02f">doNormalize</a>(negative, <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>);</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span>}</div>
</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> </div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span><span class="keyword">template</span> &lt;&gt;</div>
<div class="foldopen" id="foldopen00459" data-start="{" data-end="}">
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a7e734ab9162f8836ece323bab0ea8166"> 459</a></span><span class="keywordtype">void</span></div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span>Number::normalize&lt;unsigned long&gt;(</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> <span class="keywordtype">bool</span>&amp; negative,</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>,</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> <span class="keywordtype">int</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>,</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>,</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>)</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span>{</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <a class="code hl_friend" href="classxrpl_1_1Number.html#a4f3e98cecc5435852a47d61a2d80d02f">doNormalize</a>(negative, <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>);</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span>}</div>
</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> </div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00471" data-start="{" data-end="}">
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#ad471bfbafa5464af9c8b498e125d9873"> 471</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#ad471bfbafa5464af9c8b498e125d9873">Number::normalize</a>()</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span>{</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a> = <a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">range_</a>.get();</div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad471bfbafa5464af9c8b498e125d9873">normalize</a>(<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>, <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>, <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>, <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a>.min, <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a>.max);</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span>}</div>
</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> </div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span><span class="comment">// Copy the number, but set a new exponent. Because the mantissa doesn&#39;t change,</span></div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span><span class="comment">// the result will be &quot;mostly&quot; normalized, but the exponent could go out of</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span><span class="comment">// range.</span></div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a></div>
<div class="foldopen" id="foldopen00481" data-start="{" data-end="}">
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a80f5761398748f4d740631511d344701"> 481</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a80f5761398748f4d740631511d344701">Number::shiftExponent</a>(<span class="keywordtype">int</span> exponentDelta)<span class="keyword"> const</span></div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> XRPL_ASSERT_PARTS(<a class="code hl_function" href="classxrpl_1_1Number.html#aa164f49489cb861950f4477b1f19a211">isnormal</a>(), <span class="stringliteral">&quot;xrpl::Number::shiftExponent&quot;</span>, <span class="stringliteral">&quot;normalized&quot;</span>);</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> <span class="keyword">auto</span> <span class="keyword">const</span> newExponent = <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> + exponentDelta;</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> <span class="keywordflow">if</span> (newExponent &gt;= <a class="code hl_variable" href="classxrpl_1_1Number.html#aa41a4f7784291ffd76634c7fc567f6fb">maxExponent</a>)</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::shiftExponent&quot;</span>);</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> <span class="keywordflow">if</span> (newExponent &lt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a7cf828e636abd921b2ff2bca7a7bc8b8">minExponent</a>)</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> {</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="keywordflow">return</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> }</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <span class="keyword">const</span> result{<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>, <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>, newExponent, <a class="code hl_struct" href="structxrpl_1_1Number_1_1unchecked.html">unchecked</a>{}};</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> XRPL_ASSERT_PARTS(result.isnormal(), <span class="stringliteral">&quot;xrpl::Number::shiftExponent&quot;</span>, <span class="stringliteral">&quot;result is normalized&quot;</span>);</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span>}</div>
</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> </div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>&amp;</div>
<div class="foldopen" id="foldopen00497" data-start="{" data-end="}">
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a32c28029a3fb2ed76e3151f626be8966"> 497</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a32c28029a3fb2ed76e3151f626be8966">Number::operator+=</a>(<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <span class="keyword">const</span>&amp; y)</div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span>{</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> <span class="keywordflow">if</span> (y == zero)</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <span class="keywordflow">if</span> (*<span class="keyword">this</span> == zero)</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> {</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> *<span class="keyword">this</span> = y;</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> }</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> <span class="keywordflow">if</span> (*<span class="keyword">this</span> == -y)</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> {</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> *<span class="keyword">this</span> = zero;</div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> }</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> </div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> XRPL_ASSERT(<a class="code hl_function" href="classxrpl_1_1Number.html#aa164f49489cb861950f4477b1f19a211">isnormal</a>() &amp;&amp; y.<a class="code hl_function" href="classxrpl_1_1Number.html#aa164f49489cb861950f4477b1f19a211">isnormal</a>(), <span class="stringliteral">&quot;xrpl::Number::operator+=(Number) : is normal&quot;</span>);</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> <span class="comment">// *n = negative</span></div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> <span class="comment">// *s = sign</span></div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> <span class="comment">// *m = mantissa</span></div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> <span class="comment">// *e = exponent</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> </div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <span class="comment">// Need to use uint128_t, because large mantissas can overflow when added</span></div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> <span class="comment">// together.</span></div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="keywordtype">bool</span> xn = <a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> uint128_t xm = <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> <span class="keyword">auto</span> xe = <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> </div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="keywordtype">bool</span> yn = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> uint128_t ym = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> <span class="keyword">auto</span> ye = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> <a class="code hl_class" href="classxrpl_1_1Number_1_1Guard.html">Guard</a> g;</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="keywordflow">if</span> (xe &lt; ye)</div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> {</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> <span class="keywordflow">if</span> (xn)</div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee">set_negative</a>();</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> <span class="keywordflow">do</span></div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> {</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">push</a>(xm % 10);</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> xm /= 10;</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> ++xe;</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> } <span class="keywordflow">while</span> (xe &lt; ye);</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> }</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xe &gt; ye)</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> {</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> <span class="keywordflow">if</span> (yn)</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee">set_negative</a>();</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="keywordflow">do</span></div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> {</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">push</a>(ym % 10);</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> ym /= 10;</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> ++ye;</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> } <span class="keywordflow">while</span> (xe &gt; ye);</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> }</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> </div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a> = <a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">range_</a>.get();</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a> = <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a>.min;</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a> = <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a>.max;</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> </div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> <span class="keywordflow">if</span> (xn == yn)</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> {</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> xm += ym;</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> <span class="keywordflow">if</span> (xm &gt; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a> || xm &gt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a>)</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> {</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">push</a>(xm % 10);</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> xm /= 10;</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> ++xe;</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> }</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a1c936cf21ec79609449a3868ca013c7f">doRoundUp</a>(xn, xm, xe, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>, <span class="stringliteral">&quot;Number::addition overflow&quot;</span>);</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> }</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> {</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> <span class="keywordflow">if</span> (xm &gt; ym)</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> {</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> xm = xm - ym;</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> }</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> {</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> xm = ym - xm;</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> xe = ye;</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> xn = yn;</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> }</div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> <span class="keywordflow">while</span> (xm &lt; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a> &amp;&amp; xm * 10 &lt;= <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a>)</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> {</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> xm *= 10;</div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> xm -= g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a1977d28778524257f10ce34f95858840">pop</a>();</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> --xe;</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> }</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a587e49e00e7b5b36cb51a6b8df743c59">doRoundDown</a>(xn, xm, xe, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>);</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> }</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> </div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a> = xn;</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> = <span class="keyword">static_cast&lt;</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a><span class="keyword">&gt;</span>(xm);</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> = xe;</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad471bfbafa5464af9c8b498e125d9873">normalize</a>();</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span>}</div>
</div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> </div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span><span class="comment">// Optimization equivalent to:</span></div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span><span class="comment">// auto r = static_cast&lt;unsigned&gt;(u % 10);</span></div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span><span class="comment">// u /= 10;</span></div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span><span class="comment">// return r;</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span><span class="comment">// Derived from Hacker&#39;s Delight Second Edition Chapter 10</span></div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span><span class="comment">// by Henry S. Warren, Jr.</span></div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span><span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span></div>
<div class="foldopen" id="foldopen00602" data-start="{" data-end="}">
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"><a class="line" href="namespacexrpl.html#ab9b22ee3706801318e27c69e357b9a4b"> 602</a></span><a class="code hl_function" href="namespacexrpl.html#ab9b22ee3706801318e27c69e357b9a4b">divu10</a>(uint128_t&amp; u)</div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span>{</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> <span class="comment">// q = u * 0.75</span></div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> <span class="keyword">auto</span> q = (u &gt;&gt; 1) + (u &gt;&gt; 2);</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> <span class="comment">// iterate towards q = u * 0.8</span></div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> q += q &gt;&gt; 4;</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> q += q &gt;&gt; 8;</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> q += q &gt;&gt; 16;</div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> q += q &gt;&gt; 32;</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> q += q &gt;&gt; 64;</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> <span class="comment">// q /= 8 approximately == u / 10</span></div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> q &gt;&gt;= 3;</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> <span class="comment">// r = u - q * 10 approximately == u % 10</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <span class="keyword">auto</span> r = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span><span class="keyword">&gt;</span>(u - ((q &lt;&lt; 3) + (q &lt;&lt; 1)));</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> <span class="comment">// correction c is 1 if r &gt;= 10 else 0</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> <span class="keyword">auto</span> c = (r + 6) &gt;&gt; 4;</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> u = q + c;</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> r -= c * 10;</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> <span class="keywordflow">return</span> r;</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span>}</div>
</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> </div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span><a class="code hl_function" href="classxrpl_1_1Number.html#adbf347c98a775ae3c4bde68d36d6e36c">Number</a>&amp;</div>
<div class="foldopen" id="foldopen00624" data-start="{" data-end="}">
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#ad90bfb6a56dd24246668ebe5e2a4bb95"> 624</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#ad90bfb6a56dd24246668ebe5e2a4bb95">Number::operator*=</a>(<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <span class="keyword">const</span>&amp; y)</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span>{</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> <span class="keywordflow">if</span> (*<span class="keyword">this</span> == zero)</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> <span class="keywordflow">if</span> (y == zero)</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> {</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> *<span class="keyword">this</span> = y;</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> }</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> <span class="comment">// *n = negative</span></div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> <span class="comment">// *s = sign</span></div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> <span class="comment">// *m = mantissa</span></div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> <span class="comment">// *e = exponent</span></div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> </div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> <span class="keywordtype">bool</span> xn = <a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> <span class="keywordtype">int</span> xs = xn ? -1 : 1;</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> xm = <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> <span class="keyword">auto</span> xe = <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> </div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> <span class="keywordtype">bool</span> yn = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> <span class="keywordtype">int</span> ys = yn ? -1 : 1;</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a> ym = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> <span class="keyword">auto</span> ye = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> </div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> <span class="keyword">auto</span> zm = uint128_t(xm) * uint128_t(ym);</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="keyword">auto</span> ze = xe + ye;</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> <span class="keyword">auto</span> zs = xs * ys;</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> <span class="keywordtype">bool</span> zn = (zs == -1);</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> <a class="code hl_class" href="classxrpl_1_1Number_1_1Guard.html">Guard</a> g;</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> <span class="keywordflow">if</span> (zn)</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee">set_negative</a>();</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> </div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a> = <a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">range_</a>.get();</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a> = <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a>.min;</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a> = <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a>.max;</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> </div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> <span class="keywordflow">while</span> (zm &gt; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a> || zm &gt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a>)</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> {</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> <span class="comment">// The following is optimization for:</span></div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> <span class="comment">// g.push(static_cast&lt;unsigned&gt;(zm % 10));</span></div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> <span class="comment">// zm /= 10;</span></div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">push</a>(<a class="code hl_function" href="namespacexrpl.html#ab9b22ee3706801318e27c69e357b9a4b">divu10</a>(zm));</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> ++ze;</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> }</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> xm = <span class="keyword">static_cast&lt;</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a><span class="keyword">&gt;</span>(zm);</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> xe = ze;</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a1c936cf21ec79609449a3868ca013c7f">doRoundUp</a>(</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> zn, xm, xe, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>, <span class="stringliteral">&quot;Number::multiplication overflow : exponent is &quot;</span> + <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/to_string.html">std::to_string</a>(xe));</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a> = zn;</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> = xm;</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> = xe;</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> </div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad471bfbafa5464af9c8b498e125d9873">normalize</a>();</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span>}</div>
</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> </div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>&amp;</div>
<div class="foldopen" id="foldopen00682" data-start="{" data-end="}">
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a2c584da7e74e5b5bb6770ad27d0ac546"> 682</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a2c584da7e74e5b5bb6770ad27d0ac546">Number::operator/=</a>(<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <span class="keyword">const</span>&amp; y)</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span>{</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> <span class="keywordflow">if</span> (y == zero)</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number: divide by 0&quot;</span>);</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="keywordflow">if</span> (*<span class="keyword">this</span> == zero)</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="comment">// n* = numerator</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="comment">// d* = denominator</span></div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> <span class="comment">// *p = negative (positive?)</span></div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> <span class="comment">// *s = sign</span></div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> <span class="comment">// *m = mantissa</span></div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="comment">// *e = exponent</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> </div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> <span class="keywordtype">bool</span> np = <a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> <span class="keywordtype">int</span> ns = (np ? -1 : 1);</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> <span class="keyword">auto</span> nm = <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> <span class="keyword">auto</span> ne = <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> </div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> <span class="keywordtype">bool</span> dp = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>;</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> <span class="keywordtype">int</span> ds = (dp ? -1 : 1);</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> <span class="keyword">auto</span> dm = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a>;</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> <span class="keyword">auto</span> de = y.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a>;</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> </div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a> = <a class="code hl_variable" href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">range_</a>.get();</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a> = <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a>.min;</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a> = <a class="code hl_function" href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">range</a>.max;</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> </div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> <span class="comment">// Shift by 10^17 gives greatest precision while not overflowing</span></div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> <span class="comment">// uint128_t or the cast back to int64_t</span></div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> <span class="comment">// TODO: Can/should this be made bigger for largeRange?</span></div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> <span class="comment">// log(2^128,10) ~ 38.5</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> <span class="comment">// largeRange.log = 18, fits in 10^19</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> <span class="comment">// f can be up to 10^(38-19) = 10^19 safely</span></div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> <span class="keyword">static_assert</span>(<a class="code hl_variable" href="classxrpl_1_1Number.html#a484ed599d53a6c6f57cd6b6163dca4d6">smallRange</a>.<a class="code hl_variable" href="structxrpl_1_1MantissaRange.html#aea1c72494866d67e120bd23737080a7e">log</a> == 15);</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> <span class="keyword">static_assert</span>(<a class="code hl_variable" href="classxrpl_1_1Number.html#ace04e61c20eedabf3ead4454049d9126">largeRange</a>.<a class="code hl_variable" href="structxrpl_1_1MantissaRange.html#aea1c72494866d67e120bd23737080a7e">log</a> == 18);</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> <span class="keywordtype">bool</span> small = <a class="code hl_function" href="classxrpl_1_1Number.html#ac138187ff4d421f4158228642551756c">Number::getMantissaScale</a>() == <a class="code hl_enumvalue" href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2a159d6fc6b77bffdac828a75a473aea42">MantissaRange::small</a>;</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> uint128_t <span class="keyword">const</span> f = small ? 100&#39;000&#39;000&#39;000&#39;000&#39;000 : 10&#39;000&#39;000&#39;000&#39;000&#39;000&#39;000ULL;</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> XRPL_ASSERT_PARTS(f &gt;= <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a> * 10, <span class="stringliteral">&quot;Number::operator/=&quot;</span>, <span class="stringliteral">&quot;factor expected size&quot;</span>);</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> </div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> <span class="comment">// unsigned denominator</span></div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> <span class="keyword">auto</span> <span class="keyword">const</span> dmu = <span class="keyword">static_cast&lt;</span>uint128_t<span class="keyword">&gt;</span>(dm);</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> <span class="comment">// correctionFactor can be anything between 10 and f, depending on how much</span></div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> <span class="comment">// extra precision we want to only use for rounding with the</span></div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> <span class="comment">// largeRange. Three digits seems like plenty, and is more than</span></div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> <span class="comment">// the smallRange uses.</span></div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> uint128_t <span class="keyword">const</span> correctionFactor = 1&#39;000;</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> </div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <span class="keyword">auto</span> <span class="keyword">const</span> numerator = uint128_t(nm) * f;</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> </div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> <span class="keyword">auto</span> zm = numerator / dmu;</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> <span class="keyword">auto</span> ze = ne - de - (small ? 17 : 19);</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> <span class="keywordtype">bool</span> zn = (ns * ds) &lt; 0;</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> <span class="keywordflow">if</span> (!small)</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> {</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <span class="comment">// Virtually multiply numerator by correctionFactor. Since that would</span></div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <span class="comment">// overflow in the existing uint128_t, we&#39;ll do that part separately.</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> <span class="comment">// The math for this would work for small mantissas, but we need to</span></div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> <span class="comment">// preserve existing behavior.</span></div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> <span class="comment">//</span></div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> <span class="comment">// Consider:</span></div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> <span class="comment">// ((numerator * correctionFactor) / dmu) / correctionFactor</span></div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> <span class="comment">// = ((numerator / dmu) * correctionFactor) / correctionFactor)</span></div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> <span class="comment">//</span></div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> <span class="comment">// But that assumes infinite precision. With integer math, this is</span></div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> <span class="comment">// equivalent to</span></div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <span class="comment">//</span></div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> <span class="comment">// = ((numerator / dmu * correctionFactor)</span></div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> <span class="comment">// + ((numerator % dmu) * correctionFactor) / dmu) / correctionFactor</span></div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> <span class="comment">//</span></div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <span class="comment">// We have already set `mantissa_ = numerator / dmu`. Now we</span></div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> <span class="comment">// compute `remainder = numerator % dmu`, and if it is</span></div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> <span class="comment">// nonzero, we do the rest of the arithmetic. If it&#39;s zero, we can skip</span></div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> <span class="comment">// it.</span></div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> <span class="keyword">auto</span> <span class="keyword">const</span> remainder = (numerator % dmu);</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> <span class="keywordflow">if</span> (remainder != 0)</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> {</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> zm *= correctionFactor;</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> <span class="keyword">auto</span> <span class="keyword">const</span> correction = remainder * correctionFactor / dmu;</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> zm += correction;</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> <span class="comment">// divide by 1000 by moving the exponent, so we don&#39;t lose the</span></div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <span class="comment">// integer value we just computed</span></div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> ze -= 3;</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> }</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> }</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad471bfbafa5464af9c8b498e125d9873">normalize</a>(zn, zm, ze, <a class="code hl_function" href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">minMantissa</a>, <a class="code hl_function" href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">maxMantissa</a>);</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a> = zn;</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> = <span class="keyword">static_cast&lt;</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">internalrep</a><span class="keyword">&gt;</span>(zm);</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> = ze;</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> XRPL_ASSERT_PARTS(<a class="code hl_function" href="classxrpl_1_1Number.html#aa164f49489cb861950f4477b1f19a211">isnormal</a>(), <span class="stringliteral">&quot;xrpl::Number::operator/=&quot;</span>, <span class="stringliteral">&quot;result is normalized&quot;</span>);</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> </div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span>}</div>
</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> </div>
<div class="foldopen" id="foldopen00776" data-start="{" data-end="}">
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a26f0b9ae0cd8c2dfcc37371fa46336f1"> 776</a></span>Number::operator <a class="code hl_typedef" href="classxrpl_1_1Number.html#a3e899a2315bdca222c4f12e8a244c281">rep</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">rep</a> drops = <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>();</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> <span class="keywordtype">int</span> offset = <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>();</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <a class="code hl_class" href="classxrpl_1_1Number_1_1Guard.html">Guard</a> g;</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> <span class="keywordflow">if</span> (drops != 0)</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> {</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">negative_</a>)</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> {</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee">set_negative</a>();</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> drops = -drops;</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> }</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <span class="keywordflow">for</span> (; offset &lt; 0; ++offset)</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> {</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">push</a>(drops % 10);</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> drops /= 10;</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> }</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> <span class="keywordflow">for</span> (; offset &gt; 0; --offset)</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> {</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> <span class="keywordflow">if</span> (drops &gt; <a class="code hl_variable" href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">maxRep</a> / 10)</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::operator rep() overflow&quot;</span>);</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> drops *= 10;</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> }</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> g.<a class="code hl_function" href="classxrpl_1_1Number_1_1Guard.html#a55bc76505e3a34a0d50baa1c7eeae19c">doRound</a>(drops, <span class="stringliteral">&quot;Number::operator rep() rounding overflow&quot;</span>);</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> }</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> <span class="keywordflow">return</span> drops;</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span>}</div>
</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> </div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a></div>
<div class="foldopen" id="foldopen00805" data-start="{" data-end="}">
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a3d6e8e71ee3641f8d21041d3ade5aed0"> 805</a></span><a class="code hl_function" href="classxrpl_1_1Number.html#a3d6e8e71ee3641f8d21041d3ade5aed0">Number::truncate</a>() const noexcept</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span>{</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> &gt;= 0 || <a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> == 0)</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> </div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> ret = *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="keywordflow">while</span> (ret.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> &lt; 0 &amp;&amp; ret.<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> != 0)</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> {</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> ret.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> += 1;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> ret.<a class="code hl_variable" href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">mantissa_</a> /= <a class="code hl_typedef" href="classxrpl_1_1Number.html#a3e899a2315bdca222c4f12e8a244c281">rep</a>(10);</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> }</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> <span class="comment">// We are guaranteed that normalize() will never throw an exception</span></div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> <span class="comment">// because exponent is either negative or zero at this point.</span></div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> ret.<a class="code hl_function" href="classxrpl_1_1Number.html#ad471bfbafa5464af9c8b498e125d9873">normalize</a>();</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> <span class="keywordflow">return</span> ret;</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span>}</div>
</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> </div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div>
<div class="foldopen" id="foldopen00823" data-start="{" data-end="};">
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#a3f93a0fd9a95f114e3ab7d12ea0a1f7d"> 823</a></span><a class="code hl_friend" href="classxrpl_1_1Number.html#a3f93a0fd9a95f114e3ab7d12ea0a1f7d">to_string</a>(<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <span class="keyword">const</span>&amp; amount)</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span>{</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <span class="comment">// keep full internal accuracy, but make more human friendly if possible</span></div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> <span class="keywordflow">if</span> (amount == zero)</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;0&quot;</span>;</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> </div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> <span class="keyword">auto</span> <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> = amount.exponent_;</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> <span class="keyword">auto</span> <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> = amount.mantissa_;</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> <span class="keywordtype">bool</span> <span class="keyword">const</span> negative = amount.negative_;</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> </div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> <span class="comment">// Use scientific notation for exponents that are too small or too large</span></div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> <span class="keyword">auto</span> <span class="keyword">const</span> rangeLog = <a class="code hl_function" href="classxrpl_1_1Number.html#ae9df36fbc7e4a5663ce40454d30999ce">Number::mantissaLog</a>();</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span> <span class="keywordflow">if</span> (((<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> != 0) &amp;&amp; ((<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> &lt; -(rangeLog + 10)) || (<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> &gt; -(rangeLog - 10)))))</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> {</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> <span class="keywordflow">while</span> (<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> != 0 &amp;&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> % 10 == 0 &amp;&amp; <a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> &lt; <a class="code hl_variable" href="classxrpl_1_1Number.html#aa41a4f7784291ffd76634c7fc567f6fb">Number::maxExponent</a>)</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> {</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> <a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a> /= 10;</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> ++<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>;</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> }</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> ret = negative ? <span class="stringliteral">&quot;-&quot;</span> : <span class="stringliteral">&quot;&quot;</span>;</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> ret.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/to_string.html">std::to_string</a>(<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>));</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> ret.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(1, <span class="charliteral">&#39;e&#39;</span>);</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> ret.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/to_string.html">std::to_string</a>(<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a>));</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="keywordflow">return</span> ret;</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> }</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> </div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> XRPL_ASSERT(<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> + 43 &gt; 0, <span class="stringliteral">&quot;xrpl::to_string(Number) : minimum exponent&quot;</span>);</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> </div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> ptrdiff_t <span class="keyword">const</span> pad_prefix = rangeLog + 12;</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> ptrdiff_t <span class="keyword">const</span> pad_suffix = rangeLog + 8;</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> </div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span> raw_value(<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/to_string.html">std::to_string</a>(<a class="code hl_function" href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">mantissa</a>));</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> val;</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> </div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> val.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/reserve.html">reserve</a>(raw_value.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/size.html">length</a>() + pad_prefix + pad_suffix);</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> val.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(pad_prefix, <span class="charliteral">&#39;0&#39;</span>);</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> val.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(raw_value);</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> val.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(pad_suffix, <span class="charliteral">&#39;0&#39;</span>);</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> </div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> ptrdiff_t <span class="keyword">const</span> offset(<a class="code hl_function" href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">exponent</a> + pad_prefix + rangeLog + 1);</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> </div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <span class="keyword">auto</span> pre_from(val.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/begin.html">begin</a>());</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> <span class="keyword">auto</span> <span class="keyword">const</span> pre_to(val.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/begin.html">begin</a>() + offset);</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> </div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> <span class="keyword">auto</span> <span class="keyword">const</span> post_from(val.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/begin.html">begin</a>() + offset);</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> <span class="keyword">auto</span> post_to(val.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/end.html">end</a>());</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> </div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <span class="comment">// Crop leading zeroes. Take advantage of the fact that there&#39;s always a</span></div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> <span class="comment">// fixed amount of leading zeroes and skip them.</span></div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> <span class="keywordflow">if</span> (<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/distance.html">std::distance</a>(pre_from, pre_to) &gt; pad_prefix)</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> pre_from += pad_prefix;</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> </div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> XRPL_ASSERT(post_to &gt;= post_from, <span class="stringliteral">&quot;xrpl::to_string(Number) : first distance check&quot;</span>);</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> </div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> pre_from = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/find.html">std::find_if</a>(pre_from, pre_to, [](<span class="keywordtype">char</span> c) { <span class="keywordflow">return</span> c != <span class="charliteral">&#39;0&#39;</span>; });</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> </div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> <span class="comment">// Crop trailing zeroes. Take advantage of the fact that there&#39;s always a</span></div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> <span class="comment">// fixed amount of trailing zeroes and skip them.</span></div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> <span class="keywordflow">if</span> (<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/distance.html">std::distance</a>(post_from, post_to) &gt; pad_suffix)</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> post_to -= pad_suffix;</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> </div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> XRPL_ASSERT(post_to &gt;= post_from, <span class="stringliteral">&quot;xrpl::to_string(Number) : second distance check&quot;</span>);</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> </div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> post_to = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/find.html">std::find_if</a>(<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/make_reverse_iterator.html">std::make_reverse_iterator</a>(post_to), <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/make_reverse_iterator.html">std::make_reverse_iterator</a>(post_from), [](<span class="keywordtype">char</span> c) {</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> <span class="keywordflow">return</span> c != <span class="charliteral">&#39;0&#39;</span>;</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> }).base();</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> </div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> ret;</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> </div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span> <span class="keywordflow">if</span> (negative)</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> ret.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(1, <span class="charliteral">&#39;-&#39;</span>);</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> </div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span> <span class="comment">// Assemble the output:</span></div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> <span class="keywordflow">if</span> (pre_from == pre_to)</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span> ret.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(1, <span class="charliteral">&#39;0&#39;</span>);</div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> ret.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(pre_from, pre_to);</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> </div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> <span class="keywordflow">if</span> (post_to != post_from)</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span> {</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> ret.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(1, <span class="charliteral">&#39;.&#39;</span>);</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> ret.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">append</a>(post_from, post_to);</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span> }</div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span> </div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"> 908</span> <span class="keywordflow">return</span> ret;</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span>}</div>
</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> </div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span><span class="comment">// Returns f^n</span></div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span><span class="comment">// Uses a log_2(n) number of multiplications</span></div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</span> </div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a></div>
<div class="foldopen" id="foldopen00915" data-start="{" data-end="}">
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"><a class="line" href="namespacexrpl.html#a5dcb604ca5c6c6fdde47b8d7c20bec54"> 915</a></span><a class="code hl_function" href="namespacexrpl.html#a5dcb604ca5c6c6fdde47b8d7c20bec54">power</a>(<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <span class="keyword">const</span>&amp; f, <span class="keywordtype">unsigned</span> n)</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span>{</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span> <span class="keywordflow">if</span> (n == 0)</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno"> 918</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">Number::one</a>();</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> <span class="keywordflow">if</span> (n == 1)</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> <span class="keywordflow">return</span> f;</div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span> <span class="keyword">auto</span> r = <a class="code hl_function" href="namespacexrpl.html#a5dcb604ca5c6c6fdde47b8d7c20bec54">power</a>(f, n / 2);</div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> r *= r;</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> <span class="keywordflow">if</span> (n % 2 != 0)</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> r *= f;</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> <span class="keywordflow">return</span> r;</div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span>}</div>
</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span> </div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span><span class="comment">// Returns f^(1/d)</span></div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span><span class="comment">// Uses NewtonRaphson iterations until the result stops changing</span></div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span><span class="comment">// to find the non-negative root of the polynomial g(x) = x^d - f</span></div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> </div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span><span class="comment">// This function, and power(Number f, unsigned n, unsigned d)</span></div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span><span class="comment">// treat corner cases such as 0 roots as advised by Annex F of</span></div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span><span class="comment">// the C standard, which itself is consistent with the IEEE</span></div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span><span class="comment">// floating point standards.</span></div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> </div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span><a class="code hl_function" href="classxrpl_1_1Number.html#adbf347c98a775ae3c4bde68d36d6e36c">Number</a></div>
<div class="foldopen" id="foldopen00938" data-start="{" data-end="};">
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#af59083b29186c11c2808135c5ff075b8"> 938</a></span><a class="code hl_friend" href="classxrpl_1_1Number.html#af59083b29186c11c2808135c5ff075b8">root</a>(<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> f, <span class="keywordtype">unsigned</span> d)</div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"> 939</span>{</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a> = <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">Number::one</a>();</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> </div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> <span class="keywordflow">if</span> (f == <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a> || d == 1)</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> <span class="keywordflow">return</span> f;</div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</span> <span class="keywordflow">if</span> (d == 0)</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"> 946</span> {</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span> <span class="keywordflow">if</span> (f == -<a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>)</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>;</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespacexrpl.html#ab8c3ab80a860de11f3803c7da500418a">abs</a>(f) &lt; <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>)</div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> <span class="keywordflow">return</span> zero;</div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::root infinity&quot;</span>);</div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> }</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> <span class="keywordflow">if</span> (f &lt; zero &amp;&amp; d % 2 == 0)</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::root nan&quot;</span>);</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> <span class="keywordflow">if</span> (f == zero)</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span> <span class="keywordflow">return</span> f;</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> </div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"> 958</span> <span class="comment">// Scale f into the range (0, 1) such that f&#39;s exponent is a multiple of d</span></div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> <span class="keyword">auto</span> e = f.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> + <a class="code hl_function" href="classxrpl_1_1Number.html#ae9df36fbc7e4a5663ce40454d30999ce">Number::mantissaLog</a>() + 1;</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> <span class="keyword">auto</span> <span class="keyword">const</span> di = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(d);</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> <span class="keyword">auto</span> ex = [e = e, di = di]() <span class="comment">// Euclidean remainder of e/d</span></div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno"> 962</span> {</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span> <span class="keywordtype">int</span> k = (e &gt;= 0 ? e : e - (di - 1)) / di;</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> <span class="keywordtype">int</span> k2 = e - k * di;</div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</span> <span class="keywordflow">if</span> (k2 == 0)</div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno"> 966</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> <span class="keywordflow">return</span> di - k2;</div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"> 968</span> }();</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> e += ex;</div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> f = f.<a class="code hl_function" href="classxrpl_1_1Number.html#a80f5761398748f4d740631511d344701">shiftExponent</a>(-e); <span class="comment">// f /= 10^e;</span></div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> </div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> XRPL_ASSERT_PARTS(f.<a class="code hl_function" href="classxrpl_1_1Number.html#aa164f49489cb861950f4477b1f19a211">isnormal</a>(), <span class="stringliteral">&quot;xrpl::root(Number, unsigned)&quot;</span>, <span class="stringliteral">&quot;f is normalized&quot;</span>);</div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno"> 973</span> <span class="keywordtype">bool</span> neg = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</span> <span class="keywordflow">if</span> (f &lt; zero)</div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno"> 975</span> {</div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"> 976</span> neg = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span> f = -f;</div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> }</div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span> </div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> <span class="comment">// Quadratic least squares curve fit of f^(1/d) in the range [0, 1]</span></div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> <span class="keyword">auto</span> <span class="keyword">const</span> D = ((6 * di + 11) * di + 6) * di + 1;</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span> <span class="keyword">auto</span> <span class="keyword">const</span> a0 = 3 * di * ((2 * di - 3) * di + 1);</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> <span class="keyword">auto</span> <span class="keyword">const</span> a1 = 24 * di * (2 * di - 1);</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> <span class="keyword">auto</span> <span class="keyword">const</span> a2 = -30 * (di - 1) * di;</div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> r = ((<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{a2} * f + <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{a1}) * f + <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{a0}) / <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{D};</div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> <span class="keywordflow">if</span> (neg)</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span> {</div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> f = -f;</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> r = -r;</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span> }</div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span> </div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span> <span class="comment">// NewtonRaphson iteration of f^(1/d) with initial guess r</span></div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"> 993</span> <span class="comment">// halt when r stops changing, checking for bouncing on the last iteration</span></div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno"> 994</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> rm1{};</div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno"> 995</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> rm2{};</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> <span class="keywordflow">do</span></div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span> {</div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span> rm2 = rm1;</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span> rm1 = r;</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span> r = (<a class="code hl_function" href="classxrpl_1_1Number.html#adbf347c98a775ae3c4bde68d36d6e36c">Number</a>(d - 1) * r + f / <a class="code hl_function" href="namespacexrpl.html#a5dcb604ca5c6c6fdde47b8d7c20bec54">power</a>(r, d - 1)) / <a class="code hl_function" href="classxrpl_1_1Number.html#adbf347c98a775ae3c4bde68d36d6e36c">Number</a>(d);</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> } <span class="keywordflow">while</span> (r != rm1 &amp;&amp; r != rm2);</div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span> </div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span> <span class="comment">// return r * 10^(e/d) to reverse scaling</span></div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> <span class="keyword">auto</span> <span class="keyword">const</span> result = r.<a class="code hl_function" href="classxrpl_1_1Number.html#a80f5761398748f4d740631511d344701">shiftExponent</a>(e / di);</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span> XRPL_ASSERT_PARTS(result.isnormal(), <span class="stringliteral">&quot;xrpl::root(Number, unsigned)&quot;</span>, <span class="stringliteral">&quot;result is normalized&quot;</span>);</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span>}</div>
</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span> </div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a></div>
<div class="foldopen" id="foldopen01010" data-start="{" data-end="};">
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"><a class="line" href="classxrpl_1_1Number.html#ab83e07ef7e17606d7bcaeabe05ec1236"> 1010</a></span><a class="code hl_friend" href="classxrpl_1_1Number.html#ab83e07ef7e17606d7bcaeabe05ec1236">root2</a>(<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> f)</div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span>{</div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a> = <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">Number::one</a>();</div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span> </div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> <span class="keywordflow">if</span> (f == <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>)</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> <span class="keywordflow">return</span> f;</div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span> <span class="keywordflow">if</span> (f &lt; zero)</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::root nan&quot;</span>);</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> <span class="keywordflow">if</span> (f == zero)</div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span> <span class="keywordflow">return</span> f;</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> </div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> <span class="comment">// Scale f into the range (0, 1) such that f&#39;s exponent is a multiple of d</span></div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span> <span class="keyword">auto</span> e = f.<a class="code hl_variable" href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">exponent_</a> + <a class="code hl_function" href="classxrpl_1_1Number.html#ae9df36fbc7e4a5663ce40454d30999ce">Number::mantissaLog</a>() + 1;</div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> <span class="keywordflow">if</span> (e % 2 != 0)</div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> ++e;</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> f = f.<a class="code hl_function" href="classxrpl_1_1Number.html#a80f5761398748f4d740631511d344701">shiftExponent</a>(-e); <span class="comment">// f /= 10^e;</span></div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span> XRPL_ASSERT_PARTS(f.<a class="code hl_function" href="classxrpl_1_1Number.html#aa164f49489cb861950f4477b1f19a211">isnormal</a>(), <span class="stringliteral">&quot;xrpl::root2(Number)&quot;</span>, <span class="stringliteral">&quot;f is normalized&quot;</span>);</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> </div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span> <span class="comment">// Quadratic least squares curve fit of f^(1/d) in the range [0, 1]</span></div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> <span class="keyword">auto</span> <span class="keyword">const</span> D = 105;</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> <span class="keyword">auto</span> <span class="keyword">const</span> a0 = 18;</div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> <span class="keyword">auto</span> <span class="keyword">const</span> a1 = 144;</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span> <span class="keyword">auto</span> <span class="keyword">const</span> a2 = -60;</div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> r = ((<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{a2} * f + <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{a1}) * f + <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{a0}) / <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{D};</div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span> </div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span> <span class="comment">// NewtonRaphson iteration of f^(1/2) with initial guess r</span></div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> <span class="comment">// halt when r stops changing, checking for bouncing on the last iteration</span></div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> rm1{};</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> rm2{};</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> <span class="keywordflow">do</span></div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> {</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> rm2 = rm1;</div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> rm1 = r;</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> r = (r + f / r) / <a class="code hl_function" href="classxrpl_1_1Number.html#adbf347c98a775ae3c4bde68d36d6e36c">Number</a>(2);</div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> } <span class="keywordflow">while</span> (r != rm1 &amp;&amp; r != rm2);</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> </div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span> <span class="comment">// return r * 10^(e/2) to reverse scaling</span></div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> <span class="keyword">auto</span> <span class="keyword">const</span> result = r.<a class="code hl_function" href="classxrpl_1_1Number.html#a80f5761398748f4d740631511d344701">shiftExponent</a>(e / 2);</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span> XRPL_ASSERT_PARTS(result.isnormal(), <span class="stringliteral">&quot;xrpl::root2(Number)&quot;</span>, <span class="stringliteral">&quot;result is normalized&quot;</span>);</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> </div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span>}</div>
</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> </div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span><span class="comment">// Returns f^(n/d)</span></div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span> </div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span><a class="code hl_class" href="classxrpl_1_1Number.html">Number</a></div>
<div class="foldopen" id="foldopen01057" data-start="{" data-end="}">
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"><a class="line" href="namespacexrpl.html#a15adee4e180b37ba01edb25ac6d17ff6"> 1057</a></span><a class="code hl_function" href="namespacexrpl.html#a5dcb604ca5c6c6fdde47b8d7c20bec54">power</a>(<a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> <span class="keyword">const</span>&amp; f, <span class="keywordtype">unsigned</span> n, <span class="keywordtype">unsigned</span> d)</div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span>{</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span> <span class="keyword">constexpr</span> <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a> zero = <a class="code hl_class" href="classxrpl_1_1Number.html">Number</a>{};</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a> = <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">Number::one</a>();</div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> </div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> <span class="keywordflow">if</span> (f == <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>)</div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> <span class="keywordflow">return</span> f;</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> <span class="keyword">auto</span> g = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/numeric/gcd.html">std::gcd</a>(n, d);</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> <span class="keywordflow">if</span> (g == 0)</div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::power nan&quot;</span>);</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> <span class="keywordflow">if</span> (d == 0)</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> {</div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> <span class="keywordflow">if</span> (f == -<a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>)</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>;</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespacexrpl.html#ab8c3ab80a860de11f3803c7da500418a">abs</a>(f) &lt; <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>)</div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> <span class="keywordflow">return</span> zero;</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> <span class="comment">// abs(f) &gt; one</span></div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::power infinity&quot;</span>);</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> }</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> <span class="keywordflow">if</span> (n == 0)</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">one</a>;</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> n /= g;</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> d /= g;</div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> <span class="keywordflow">if</span> ((n % 2) == 1 &amp;&amp; (d % 2) == 0 &amp;&amp; f &lt; zero)</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> <span class="keywordflow">throw</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a>(<span class="stringliteral">&quot;Number::power nan&quot;</span>);</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> <span class="keywordflow">return</span> <a class="code hl_friend" href="classxrpl_1_1Number.html#af59083b29186c11c2808135c5ff075b8">root</a>(<a class="code hl_function" href="namespacexrpl.html#a5dcb604ca5c6c6fdde47b8d7c20bec54">power</a>(f, n), d);</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span>}</div>
</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> </div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span>} <span class="comment">// namespace xrpl</span></div>
<div class="ttc" id="aalgorithm_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/algorithm.html">algorithm</a></div></div>
<div class="ttc" id="aappend_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/append.html">std::string::append</a></div><div class="ttdeci">T append(T... args)</div></div>
<div class="ttc" id="abasic_string_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div></div>
<div class="ttc" id="abegin_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/begin.html">std::string::begin</a></div><div class="ttdeci">T begin(T... args)</div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html">xrpl::Number::Guard</a></div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00067">Number.cpp:68</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a0ebc09f6e6241ba83bec8d3268d50c31"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a0ebc09f6e6241ba83bec8d3268d50c31">xrpl::Number::Guard::round</a></div><div class="ttdeci">int round() noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00176">Number.cpp:176</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a11e2fc9dcf9120daa2ff1976ffd83278"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a11e2fc9dcf9120daa2ff1976ffd83278">xrpl::Number::Guard::set_positive</a></div><div class="ttdeci">void set_positive() noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00131">Number.cpp:131</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a1977d28778524257f10ce34f95858840"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a1977d28778524257f10ce34f95858840">xrpl::Number::Guard::pop</a></div><div class="ttdeci">unsigned pop() noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00164">Number.cpp:164</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a1c936cf21ec79609449a3868ca013c7f"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a1c936cf21ec79609449a3868ca013c7f">xrpl::Number::Guard::doRoundUp</a></div><div class="ttdeci">void doRoundUp(bool &amp;negative, T &amp;mantissa, int &amp;exponent, internalrep const &amp;minMantissa, internalrep const &amp;maxMantissa, std::string location)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00235">Number.cpp:235</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a491b4ea2971fe0221fa0e61179154c6b"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a491b4ea2971fe0221fa0e61179154c6b">xrpl::Number::Guard::bringIntoRange</a></div><div class="ttdeci">void bringIntoRange(bool &amp;negative, T &amp;mantissa, int &amp;exponent, internalrep const &amp;minMantissa)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00214">Number.cpp:214</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a55bc76505e3a34a0d50baa1c7eeae19c"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a55bc76505e3a34a0d50baa1c7eeae19c">xrpl::Number::Guard::doRound</a></div><div class="ttdeci">void doRound(rep &amp;drops, std::string location)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00279">Number.cpp:279</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a56a81d86e08ba5f15554710ee6558f5d"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a56a81d86e08ba5f15554710ee6558f5d">xrpl::Number::Guard::is_negative</a></div><div class="ttdeci">bool is_negative() const noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00143">Number.cpp:143</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a587e49e00e7b5b36cb51a6b8df743c59"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a587e49e00e7b5b36cb51a6b8df743c59">xrpl::Number::Guard::doRoundDown</a></div><div class="ttdeci">void doRoundDown(bool &amp;negative, T &amp;mantissa, int &amp;exponent, internalrep const &amp;minMantissa)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00262">Number.cpp:262</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a7e98b203dc4370e448d1398ecdf05745"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a7e98b203dc4370e448d1398ecdf05745">xrpl::Number::Guard::doPush</a></div><div class="ttdeci">void doPush(unsigned d) noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00149">Number.cpp:149</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a81424a2e84074c3ecd4cb454f359c3ee"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a81424a2e84074c3ecd4cb454f359c3ee">xrpl::Number::Guard::set_negative</a></div><div class="ttdeci">void set_negative() noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00137">Number.cpp:137</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_a9671112916b037a39959d72ed3ea8612"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#a9671112916b037a39959d72ed3ea8612">xrpl::Number::Guard::xbit_</a></div><div class="ttdeci">std::uint8_t xbit_</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00070">Number.cpp:70</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_ac3545d65922e16f7cd18897679a0466f"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#ac3545d65922e16f7cd18897679a0466f">xrpl::Number::Guard::Guard</a></div><div class="ttdeci">Guard()</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00074">Number.cpp:74</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_ac5ce476230510eae348dd28258f83322"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#ac5ce476230510eae348dd28258f83322">xrpl::Number::Guard::sbit_</a></div><div class="ttdeci">std::uint8_t sbit_</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00071">Number.cpp:71</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_aeeb29d02bbadd5bf87e04a4d1d203363"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#aeeb29d02bbadd5bf87e04a4d1d203363">xrpl::Number::Guard::push</a></div><div class="ttdeci">void push(T d) noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00158">Number.cpp:158</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_1_1Guard_html_af2fda4b03dd23b878f01f16425cb6c7e"><div class="ttname"><a href="classxrpl_1_1Number_1_1Guard.html#af2fda4b03dd23b878f01f16425cb6c7e">xrpl::Number::Guard::digits_</a></div><div class="ttdeci">std::uint64_t digits_</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00069">Number.cpp:69</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html"><div class="ttname"><a href="classxrpl_1_1Number.html">xrpl::Number</a></div><div class="ttdoc">Number is a floating point type that can represent a wide range of values.</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00207">Number.h:208</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a0981e6287c63318941d3b12d5c51c419"><div class="ttname"><a href="classxrpl_1_1Number.html#a0981e6287c63318941d3b12d5c51c419">xrpl::Number::oneSmall</a></div><div class="ttdeci">static constexpr Number oneSmall()</div><div class="ttdoc">oneSmall is needed because the ranges are private</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00327">Number.cpp:327</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a0c71d26d6de400ed12cf3923157aca31"><div class="ttname"><a href="classxrpl_1_1Number.html#a0c71d26d6de400ed12cf3923157aca31">xrpl::Number::getround</a></div><div class="ttdeci">static rounding_mode getround()</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00033">Number.cpp:33</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a10e51120e8e4f1f3a08d5211069658f6"><div class="ttname"><a href="classxrpl_1_1Number.html#a10e51120e8e4f1f3a08d5211069658f6">xrpl::Number::mantissa_</a></div><div class="ttdeci">internalrep mantissa_</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00213">Number.h:213</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a1be401c2cd91d8311dbc55bf6038a492"><div class="ttname"><a href="classxrpl_1_1Number.html#a1be401c2cd91d8311dbc55bf6038a492">xrpl::Number::minMantissa</a></div><div class="ttdeci">static internalrep minMantissa()</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00402">Number.h:402</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a223cbe5eabe0bea1d9156f05c971e5c3"><div class="ttname"><a href="classxrpl_1_1Number.html#a223cbe5eabe0bea1d9156f05c971e5c3">xrpl::Number::mantissa</a></div><div class="ttdeci">constexpr rep mantissa() const noexcept</div><div class="ttdoc">Returns the mantissa of the external view of the Number.</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00543">Number.h:543</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a274b459d7478df80795caed8a56d4f00"><div class="ttname"><a href="classxrpl_1_1Number.html#a274b459d7478df80795caed8a56d4f00">xrpl::Number::setround</a></div><div class="ttdeci">static rounding_mode setround(rounding_mode mode)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00039">Number.cpp:39</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a2c584da7e74e5b5bb6770ad27d0ac546"><div class="ttname"><a href="classxrpl_1_1Number.html#a2c584da7e74e5b5bb6770ad27d0ac546">xrpl::Number::operator/=</a></div><div class="ttdeci">Number &amp; operator/=(Number const &amp;x)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00682">Number.cpp:682</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a32c28029a3fb2ed76e3151f626be8966"><div class="ttname"><a href="classxrpl_1_1Number.html#a32c28029a3fb2ed76e3151f626be8966">xrpl::Number::operator+=</a></div><div class="ttdeci">Number &amp; operator+=(Number const &amp;x)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00497">Number.cpp:497</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a3d6e8e71ee3641f8d21041d3ade5aed0"><div class="ttname"><a href="classxrpl_1_1Number.html#a3d6e8e71ee3641f8d21041d3ade5aed0">xrpl::Number::truncate</a></div><div class="ttdeci">Number truncate() const noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00805">Number.cpp:805</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a3e899a2315bdca222c4f12e8a244c281"><div class="ttname"><a href="classxrpl_1_1Number.html#a3e899a2315bdca222c4f12e8a244c281">xrpl::Number::rep</a></div><div class="ttdeci">std::int64_t rep</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00209">Number.h:209</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a3f93a0fd9a95f114e3ab7d12ea0a1f7d"><div class="ttname"><a href="classxrpl_1_1Number.html#a3f93a0fd9a95f114e3ab7d12ea0a1f7d">xrpl::Number::to_string</a></div><div class="ttdeci">friend std::string to_string(Number const &amp;amount)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00823">Number.cpp:823</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a40e08f75077897215c66d102b5b75f95"><div class="ttname"><a href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95">xrpl::Number::rounding_mode</a></div><div class="ttdeci">rounding_mode</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00381">Number.h:381</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a40e08f75077897215c66d102b5b75f95aa0120ec63f8c549bc0bf1c945e36e779"><div class="ttname"><a href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95aa0120ec63f8c549bc0bf1c945e36e779">xrpl::Number::towards_zero</a></div><div class="ttdeci">@ towards_zero</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00381">Number.h:381</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a40e08f75077897215c66d102b5b75f95aa1683b7e2939668142366896b111931a"><div class="ttname"><a href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95aa1683b7e2939668142366896b111931a">xrpl::Number::to_nearest</a></div><div class="ttdeci">@ to_nearest</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00381">Number.h:381</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a40e08f75077897215c66d102b5b75f95aaf71effcd4dcf7bc7c89bb51e27e8b17"><div class="ttname"><a href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95aaf71effcd4dcf7bc7c89bb51e27e8b17">xrpl::Number::upward</a></div><div class="ttdeci">@ upward</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00381">Number.h:381</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a40e08f75077897215c66d102b5b75f95aefac6c5bd63a85dcee4fc69baf788d40"><div class="ttname"><a href="classxrpl_1_1Number.html#a40e08f75077897215c66d102b5b75f95aefac6c5bd63a85dcee4fc69baf788d40">xrpl::Number::downward</a></div><div class="ttdeci">@ downward</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00381">Number.h:381</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a484ed599d53a6c6f57cd6b6163dca4d6"><div class="ttname"><a href="classxrpl_1_1Number.html#a484ed599d53a6c6f57cd6b6163dca4d6">xrpl::Number::smallRange</a></div><div class="ttdeci">static constexpr MantissaRange smallRange</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00440">Number.h:440</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a4f3e98cecc5435852a47d61a2d80d02f"><div class="ttname"><a href="classxrpl_1_1Number.html#a4f3e98cecc5435852a47d61a2d80d02f">xrpl::Number::doNormalize</a></div><div class="ttdeci">friend void doNormalize(bool &amp;negative, T &amp;mantissa_, int &amp;exponent_, MantissaRange::rep const &amp;minMantissa, MantissaRange::rep const &amp;maxMantissa)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00355">Number.cpp:355</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a5b91f73f5bb83bdca17bcd2378b612f8"><div class="ttname"><a href="classxrpl_1_1Number.html#a5b91f73f5bb83bdca17bcd2378b612f8">xrpl::Number::maxRep</a></div><div class="ttdeci">static constexpr internalrep maxRep</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00221">Number.h:221</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a67e66cfedbb2ff6c670917e4872da14f"><div class="ttname"><a href="classxrpl_1_1Number.html#a67e66cfedbb2ff6c670917e4872da14f">xrpl::Number::internalrep</a></div><div class="ttdeci">MantissaRange::rep internalrep</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00210">Number.h:210</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a73b1712a4714d18b02c0b9158a3ac201"><div class="ttname"><a href="classxrpl_1_1Number.html#a73b1712a4714d18b02c0b9158a3ac201">xrpl::Number::mode_</a></div><div class="ttdeci">static thread_local rounding_mode mode_</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00437">Number.h:437</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a7cf828e636abd921b2ff2bca7a7bc8b8"><div class="ttname"><a href="classxrpl_1_1Number.html#a7cf828e636abd921b2ff2bca7a7bc8b8">xrpl::Number::minExponent</a></div><div class="ttdeci">static constexpr int minExponent</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00218">Number.h:218</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a80f5761398748f4d740631511d344701"><div class="ttname"><a href="classxrpl_1_1Number.html#a80f5761398748f4d740631511d344701">xrpl::Number::shiftExponent</a></div><div class="ttdeci">Number shiftExponent(int exponentDelta) const</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00481">Number.cpp:481</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a89a1e2cc1d2d69c86bbb03340284a6b7"><div class="ttname"><a href="classxrpl_1_1Number.html#a89a1e2cc1d2d69c86bbb03340284a6b7">xrpl::Number::setMantissaScale</a></div><div class="ttdeci">static void setMantissaScale(MantissaRange::mantissa_scale scale)</div><div class="ttdoc">Changes which mantissa scale is used for normalization.</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00051">Number.cpp:51</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a966f5eca09ff61f50f0c377dea86c798"><div class="ttname"><a href="classxrpl_1_1Number.html#a966f5eca09ff61f50f0c377dea86c798">xrpl::Number::externalToInternal</a></div><div class="ttdeci">static internalrep externalToInternal(rep mantissa)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00308">Number.cpp:308</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_a992a7b726b84f3e57bdba64acc107ba9"><div class="ttname"><a href="classxrpl_1_1Number.html#a992a7b726b84f3e57bdba64acc107ba9">xrpl::Number::maxMantissa</a></div><div class="ttdeci">static internalrep maxMantissa()</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00408">Number.h:408</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_aa164f49489cb861950f4477b1f19a211"><div class="ttname"><a href="classxrpl_1_1Number.html#aa164f49489cb861950f4477b1f19a211">xrpl::Number::isnormal</a></div><div class="ttdeci">bool isnormal() const noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00681">Number.h:681</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_aa4058fefe18f86063240cfd2ba985358"><div class="ttname"><a href="classxrpl_1_1Number.html#aa4058fefe18f86063240cfd2ba985358">xrpl::Number::exponent</a></div><div class="ttdeci">constexpr int exponent() const noexcept</div><div class="ttdoc">Returns the exponent of the external view of the Number.</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00564">Number.h:564</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_aa41a4f7784291ffd76634c7fc567f6fb"><div class="ttname"><a href="classxrpl_1_1Number.html#aa41a4f7784291ffd76634c7fc567f6fb">xrpl::Number::maxExponent</a></div><div class="ttdeci">static constexpr int maxExponent</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00219">Number.h:219</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ab2381c12707d6e7e9a7704b4733ae3af"><div class="ttname"><a href="classxrpl_1_1Number.html#ab2381c12707d6e7e9a7704b4733ae3af">xrpl::Number::range_</a></div><div class="ttdeci">static thread_local std::reference_wrapper&lt; MantissaRange const &gt; range_</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00458">Number.h:458</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ab83e07ef7e17606d7bcaeabe05ec1236"><div class="ttname"><a href="classxrpl_1_1Number.html#ab83e07ef7e17606d7bcaeabe05ec1236">xrpl::Number::root2</a></div><div class="ttdeci">friend Number root2(Number f)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l01010">Number.cpp:1010</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ac138187ff4d421f4158228642551756c"><div class="ttname"><a href="classxrpl_1_1Number.html#ac138187ff4d421f4158228642551756c">xrpl::Number::getMantissaScale</a></div><div class="ttdeci">static MantissaRange::mantissa_scale getMantissaScale()</div><div class="ttdoc">Returns which mantissa scale is currently in use for normalization.</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00045">Number.cpp:45</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ac901dca6c4ae9b77298650a82ad606f3"><div class="ttname"><a href="classxrpl_1_1Number.html#ac901dca6c4ae9b77298650a82ad606f3">xrpl::Number::exponent_</a></div><div class="ttdeci">int exponent_</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00214">Number.h:214</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ace04e61c20eedabf3ead4454049d9126"><div class="ttname"><a href="classxrpl_1_1Number.html#ace04e61c20eedabf3ead4454049d9126">xrpl::Number::largeRange</a></div><div class="ttdeci">static constexpr MantissaRange largeRange</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00447">Number.h:447</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ad471bfbafa5464af9c8b498e125d9873"><div class="ttname"><a href="classxrpl_1_1Number.html#ad471bfbafa5464af9c8b498e125d9873">xrpl::Number::normalize</a></div><div class="ttdeci">void normalize()</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00471">Number.cpp:471</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ad7b3dcf0314ef5327550516bdb1fa7d2"><div class="ttname"><a href="classxrpl_1_1Number.html#ad7b3dcf0314ef5327550516bdb1fa7d2">xrpl::Number::one</a></div><div class="ttdeci">static Number one()</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00343">Number.cpp:343</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ad90bfb6a56dd24246668ebe5e2a4bb95"><div class="ttname"><a href="classxrpl_1_1Number.html#ad90bfb6a56dd24246668ebe5e2a4bb95">xrpl::Number::operator*=</a></div><div class="ttdeci">Number &amp; operator*=(Number const &amp;x)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00624">Number.cpp:624</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_adbf347c98a775ae3c4bde68d36d6e36c"><div class="ttname"><a href="classxrpl_1_1Number.html#adbf347c98a775ae3c4bde68d36d6e36c">xrpl::Number::Number</a></div><div class="ttdeci">constexpr Number()=default</div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ae07fcd3fb3a2d61a8c4491e43c3d99b2"><div class="ttname"><a href="classxrpl_1_1Number.html#ae07fcd3fb3a2d61a8c4491e43c3d99b2">xrpl::Number::oneLarge</a></div><div class="ttdeci">static constexpr Number oneLarge()</div><div class="ttdoc">oneLarge is needed because the ranges are private</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00335">Number.cpp:335</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ae6da4d1edef20960bc7d37aa0a731fe0"><div class="ttname"><a href="classxrpl_1_1Number.html#ae6da4d1edef20960bc7d37aa0a731fe0">xrpl::Number::negative_</a></div><div class="ttdeci">bool negative_</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00212">Number.h:212</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_ae9df36fbc7e4a5663ce40454d30999ce"><div class="ttname"><a href="classxrpl_1_1Number.html#ae9df36fbc7e4a5663ce40454d30999ce">xrpl::Number::mantissaLog</a></div><div class="ttdeci">static int mantissaLog()</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00414">Number.h:414</a></div></div>
<div class="ttc" id="aclassxrpl_1_1Number_html_af59083b29186c11c2808135c5ff075b8"><div class="ttname"><a href="classxrpl_1_1Number.html#af59083b29186c11c2808135c5ff075b8">xrpl::Number::root</a></div><div class="ttdeci">friend Number root(Number f, unsigned d)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00938">Number.cpp:938</a></div></div>
<div class="ttc" id="aconceptxrpl_1_1UnsignedMantissa_html"><div class="ttname"><a href="conceptxrpl_1_1UnsignedMantissa.html">xrpl::UnsignedMantissa</a></div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00065">Number.cpp:65</a></div></div>
<div class="ttc" id="acstddef_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/cstddef.html">cstddef</a></div></div>
<div class="ttc" id="acstdint_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/cstdint.html">cstdint</a></div></div>
<div class="ttc" id="adistance_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/iterator/distance.html">std::distance</a></div><div class="ttdeci">T distance(T... args)</div></div>
<div class="ttc" id="aend_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/end.html">std::string::end</a></div><div class="ttdeci">T end(T... args)</div></div>
<div class="ttc" id="aexchange_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/exchange.html">std::exchange</a></div><div class="ttdeci">T exchange(T... args)</div></div>
<div class="ttc" id="afind_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/find.html">std::find_if</a></div><div class="ttdeci">T find_if(T... args)</div></div>
<div class="ttc" id="agcd_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/numeric/gcd.html">std::gcd</a></div><div class="ttdeci">T gcd(T... args)</div></div>
<div class="ttc" id="ainteger_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a></div></div>
<div class="ttc" id="ais_same_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/is_same.html">std::is_same_v</a></div><div class="ttdeci">T is_same_v</div></div>
<div class="ttc" id="aiterator_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/iterator.html">iterator</a></div></div>
<div class="ttc" id="alimits_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/limits.html">limits</a></div></div>
<div class="ttc" id="amake_reverse_iterator_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/iterator/make_reverse_iterator.html">std::make_reverse_iterator</a></div><div class="ttdeci">T make_reverse_iterator(T... args)</div></div>
<div class="ttc" id="anamespacestd_html"><div class="ttname"><a href="namespacestd.html">std</a></div><div class="ttdoc">STL namespace.</div></div>
<div class="ttc" id="anamespacexrpl_html"><div class="ttname"><a href="namespacexrpl.html">xrpl</a></div><div class="ttdoc">Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.</div><div class="ttdef"><b>Definition</b> <a href="algorithm_8h_source.html#l00006">algorithm.h:6</a></div></div>
<div class="ttc" id="anamespacexrpl_html_a16550239e117c441e0e17bd1c67beeba"><div class="ttname"><a href="namespacexrpl.html#a16550239e117c441e0e17bd1c67beeba">xrpl::LogicError</a></div><div class="ttdeci">void LogicError(std::string const &amp;how) noexcept</div><div class="ttdoc">Called when faulty logic causes a broken invariant.</div><div class="ttdef"><b>Definition</b> <a href="libxrpl_2basics_2contract_8cpp_source.html#l00018">libxrpl/basics/contract.cpp:18</a></div></div>
<div class="ttc" id="anamespacexrpl_html_a34fabf5c9fc5c30e86623b6a5eb0ac7d"><div class="ttname"><a href="namespacexrpl.html#a34fabf5c9fc5c30e86623b6a5eb0ac7d">xrpl::range</a></div><div class="ttdeci">ClosedInterval&lt; T &gt; range(T low, T high)</div><div class="ttdoc">Create a closed range interval.</div><div class="ttdef"><b>Definition</b> <a href="RangeSet_8h_source.html#l00035">RangeSet.h:35</a></div></div>
<div class="ttc" id="anamespacexrpl_html_a5dcb604ca5c6c6fdde47b8d7c20bec54"><div class="ttname"><a href="namespacexrpl.html#a5dcb604ca5c6c6fdde47b8d7c20bec54">xrpl::power</a></div><div class="ttdeci">Number power(Number const &amp;f, unsigned n)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00915">Number.cpp:915</a></div></div>
<div class="ttc" id="anamespacexrpl_html_a8b5241821c12fc02371c08f79f642801"><div class="ttname"><a href="namespacexrpl.html#a8b5241821c12fc02371c08f79f642801">xrpl::oneSml</a></div><div class="ttdeci">constexpr Number oneSml</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00332">Number.cpp:332</a></div></div>
<div class="ttc" id="anamespacexrpl_html_ab8c3ab80a860de11f3803c7da500418a"><div class="ttname"><a href="namespacexrpl.html#ab8c3ab80a860de11f3803c7da500418a">xrpl::abs</a></div><div class="ttdeci">constexpr Number abs(Number x) noexcept</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00707">Number.h:707</a></div></div>
<div class="ttc" id="anamespacexrpl_html_ab9b22ee3706801318e27c69e357b9a4b"><div class="ttname"><a href="namespacexrpl.html#ab9b22ee3706801318e27c69e357b9a4b">xrpl::divu10</a></div><div class="ttdeci">static unsigned divu10(uint128_t &amp;u)</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00602">Number.cpp:602</a></div></div>
<div class="ttc" id="anamespacexrpl_html_ac8b787145f3e674ee3c180e784f42142"><div class="ttname"><a href="namespacexrpl.html#ac8b787145f3e674ee3c180e784f42142">xrpl::oneLrg</a></div><div class="ttdeci">constexpr Number oneLrg</div><div class="ttdef"><b>Definition</b> <a href="Number_8cpp_source.html#l00340">Number.cpp:340</a></div></div>
<div class="ttc" id="anumeric_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/numeric.html">numeric</a></div></div>
<div class="ttc" id="anumeric_limits_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/numeric_limits.html">std::numeric_limits</a></div></div>
<div class="ttc" id="aoverflow_error_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/error/overflow_error.html">std::overflow_error</a></div></div>
<div class="ttc" id="areference_wrapper_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper.html">std::reference_wrapper</a></div></div>
<div class="ttc" id="areserve_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/reserve.html">std::string::reserve</a></div><div class="ttdeci">T reserve(T... args)</div></div>
<div class="ttc" id="asize_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/size.html">std::string::length</a></div><div class="ttdeci">T length(T... args)</div></div>
<div class="ttc" id="astdexcept_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/stdexcept.html">stdexcept</a></div></div>
<div class="ttc" id="astring_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/string.html">string</a></div></div>
<div class="ttc" id="astructxrpl_1_1MantissaRange_html_a20f7a2bea468b1da813e45c7881e29f2"><div class="ttname"><a href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2">xrpl::MantissaRange::mantissa_scale</a></div><div class="ttdeci">mantissa_scale</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00074">Number.h:74</a></div></div>
<div class="ttc" id="astructxrpl_1_1MantissaRange_html_a20f7a2bea468b1da813e45c7881e29f2a0b64e613fbbea29706141a2e1a08ffa5"><div class="ttname"><a href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2a0b64e613fbbea29706141a2e1a08ffa5">xrpl::MantissaRange::large</a></div><div class="ttdeci">@ large</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00074">Number.h:74</a></div></div>
<div class="ttc" id="astructxrpl_1_1MantissaRange_html_a20f7a2bea468b1da813e45c7881e29f2a159d6fc6b77bffdac828a75a473aea42"><div class="ttname"><a href="structxrpl_1_1MantissaRange.html#a20f7a2bea468b1da813e45c7881e29f2a159d6fc6b77bffdac828a75a473aea42">xrpl::MantissaRange::small</a></div><div class="ttdeci">@ small</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00074">Number.h:74</a></div></div>
<div class="ttc" id="astructxrpl_1_1MantissaRange_html_a6e5cafa1836416d4069e77a8fb54363c"><div class="ttname"><a href="structxrpl_1_1MantissaRange.html#a6e5cafa1836416d4069e77a8fb54363c">xrpl::MantissaRange::min</a></div><div class="ttdeci">rep min</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00081">Number.h:81</a></div></div>
<div class="ttc" id="astructxrpl_1_1MantissaRange_html_aea1c72494866d67e120bd23737080a7e"><div class="ttname"><a href="structxrpl_1_1MantissaRange.html#aea1c72494866d67e120bd23737080a7e">xrpl::MantissaRange::log</a></div><div class="ttdeci">int log</div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00083">Number.h:83</a></div></div>
<div class="ttc" id="astructxrpl_1_1Number_1_1unchecked_html"><div class="ttname"><a href="structxrpl_1_1Number_1_1unchecked.html">xrpl::Number::unchecked</a></div><div class="ttdef"><b>Definition</b> <a href="Number_8h_source.html#l00226">Number.h:227</a></div></div>
<div class="ttc" id="ato_string_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/to_string.html">std::to_string</a></div><div class="ttdeci">T to_string(T... args)</div></div>
<div class="ttc" id="atype_traits_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/type_traits.html">type_traits</a></div></div>
<div class="ttc" id="autility_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/utility.html">utility</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>