003 File Manager
Current Path:
/usr/local/share/doc/mpdecimal/libmpdec
usr
/
local
/
share
/
doc
/
mpdecimal
/
libmpdec
/
π
..
π
README.txt
(88 B)
π
_static
π
arithmetic.html
(109.46 KB)
π
assign-convert.html
(56.83 KB)
π
attributes.html
(24.85 KB)
π
context.html
(37.84 KB)
π
decimals.html
(8.45 KB)
π
functions.html
(58.37 KB)
π
index.html
(16.95 KB)
π
memory.html
(15.59 KB)
π
objects.inv
(1.83 KB)
π
search.html
(2.76 KB)
π
searchindex.js
(30.97 KB)
π
various.html
(40.5 KB)
Editing: context.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta content="index,follow" name="robots" /> <meta content="libmpdec documentation" name="description" /> <title>Context — mpdecimal 2.5.1 documentation</title> <link rel="stylesheet" href="_static/mpdecimal-doc.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/doctools.js"></script> <script src="_static/language_data.js"></script> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Decimals" href="decimals.html" /> <link rel="prev" title="Function Index" href="functions.html" /> </head><body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="decimals.html" title="Decimals" accesskey="N">next</a></li> <li class="right" > <a href="functions.html" title="Function Index" accesskey="P">previous</a> |</li> <li><a href="http://www.bytereef.org/mpdecimal/index.html">project home</a></li> </ul> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3><a href="index.html">Table of Contents</a></h3> <ul> <li><a class="reference internal" href="#">Context</a><ul> <li><a class="reference internal" href="#data-type">Data Type</a></li> <li><a class="reference internal" href="#constants">Constants</a></li> <li><a class="reference internal" href="#precision-and-exponents">Precision and Exponents</a></li> <li><a class="reference internal" href="#rounding">Rounding</a></li> <li><a class="reference internal" href="#signals-and-conditions">Signals and Conditions</a></li> <li><a class="reference internal" href="#exponent-clamping">Exponent Clamping</a></li> <li><a class="reference internal" href="#correct-rounding">Correct Rounding</a></li> </ul> </li> <li><a class="reference internal" href="#context-functions">Context Functions</a><ul> <li><a class="reference internal" href="#initialization">Initialization</a></li> <li><a class="reference internal" href="#ieee-interchange-formats">IEEE Interchange Formats</a></li> <li><a class="reference internal" href="#getters-and-setters">Getters and Setters</a></li> <li><a class="reference internal" href="#calling-the-trap-handler">Calling the Trap Handler</a></li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="functions.html" title="previous chapter">Function Index</a></p> <h4>Next topic</h4> <p class="topless"><a href="decimals.html" title="next chapter">Decimals</a></p> <div id="searchbox" style="display: none" role="search"> <h3 id="searchlabel">Quick search</h3> <div class="searchformwrapper"> <form class="search" action="search.html" method="get"> <input type="text" name="q" aria-labelledby="searchlabel" /> <input type="submit" value="Go" /> </form> </div> </div> <script>$('#searchbox').show(0);</script> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <div class="section" id="context"> <h1>Context</h1> <p>Most operations are affected by context. Usually, a pointer to the context is passed as the last parameter to signaling functions or the last but one parameter to quiet functions.</p> <div class="section" id="data-type"> <h2>Data Type</h2> <p>The context is defined as a C struct:</p> <div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf"><mpdecimal.h></span><span class="cp"></span> <span class="k">typedef</span> <span class="k">struct</span> <span class="nc">mpd_context_t</span> <span class="p">{</span> <span class="n">mpd_ssize_t</span> <span class="n">prec</span><span class="p">;</span> <span class="c1">// precision</span> <span class="n">mpd_ssize_t</span> <span class="n">emax</span><span class="p">;</span> <span class="c1">// max positive exp</span> <span class="n">mpd_ssize_t</span> <span class="n">emin</span><span class="p">;</span> <span class="c1">// min negative exp</span> <span class="kt">uint32_t</span> <span class="n">traps</span><span class="p">;</span> <span class="c1">// status events that should be trapped</span> <span class="kt">uint32_t</span> <span class="n">status</span><span class="p">;</span> <span class="c1">// status flags</span> <span class="kt">uint32_t</span> <span class="n">newtrap</span><span class="p">;</span> <span class="c1">// set by mpd_addstatus_raise()</span> <span class="kt">int</span> <span class="n">round</span><span class="p">;</span> <span class="c1">// rounding mode</span> <span class="kt">int</span> <span class="n">clamp</span><span class="p">;</span> <span class="c1">// clamp mode</span> <span class="kt">int</span> <span class="n">allcr</span><span class="p">;</span> <span class="c1">// all functions correctly rounded</span> <span class="p">}</span> <span class="n">mpd_context_t</span><span class="p">;</span> </pre></div> </div> </div> <div class="section" id="constants"> <h2>Constants</h2> <blockquote> <div><table border="1" class="docutils align-default"> <colgroup> <col width="31%" /> <col width="28%" /> <col width="41%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head"> </th> <th class="head">32-bit</th> <th class="head">64-bit</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MAX_PREC</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">425000000</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">999999999999999999</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MAX_EMAX</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">425000000</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">999999999999999999</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MIN_EMIN</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">-425000000</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">-999999999999999999</span></code></td> </tr> </tbody> </table> </div></blockquote> </div> <div class="section" id="precision-and-exponents"> <h2>Precision and Exponents</h2> <blockquote> <div><table border="1" class="docutils align-default"> <colgroup> <col width="24%" /> <col width="76%" /> </colgroup> <tbody valign="top"> <tr class="row-odd"><td><em>prec</em></td> <td>[<code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code>, <code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MAX_PREC</span></code>]</td> </tr> <tr class="row-even"><td><em>emax</em></td> <td>[<code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code>, <code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MAX_EMAX</span></code>]</td> </tr> <tr class="row-odd"><td><em>emin</em></td> <td>[<code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MIN_EMIN</span></code>, <code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code>]</td> </tr> </tbody> </table> </div></blockquote> <p>Apart from the limits, the following rules must be observed when setting the context manually:</p> <blockquote> <div><ul class="simple"> <li><em>prec</em> <= <em>emax</em></li> <li><em>emin</em> = 1 - <em>emax</em> or <em>emin</em> = <em>-emax</em></li> </ul> </div></blockquote> <p>The specification requires 5 x <em>prec</em> <= <em>emax</em> and recommends 10 x <em>prec</em> <= <em>emax</em>.</p> </div> <div class="section" id="rounding"> <h2>Rounding</h2> <p>The <em>round</em> field can take one of these values:</p> <blockquote> <div><table border="1" class="docutils align-default"> <colgroup> <col width="42%" /> <col width="58%" /> </colgroup> <tbody valign="top"> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_UP</span></code></td> <td>round away from <code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_DOWN</span></code></td> <td>round toward <code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code> (truncate)</td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_CEILING</span></code></td> <td>round toward <code class="xref c c-macro docutils literal notranslate"><span class="pre">+infinity</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_FLOOR</span></code></td> <td>round toward <code class="xref c c-macro docutils literal notranslate"><span class="pre">-infinity</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_UP</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0.5</span></code> is rounded up</td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_DOWN</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0.5</span></code> is rounded down</td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_EVEN</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0.5</span></code> is rounded to even</td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_05UP</span></code></td> <td>round zero or five away from <code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_TRUNC</span></code></td> <td>truncate, but set infinities</td> </tr> </tbody> </table> </div></blockquote> </div> <div class="section" id="signals-and-conditions"> <h2>Signals and Conditions</h2> <p>The standard distinguishes between <em>signals</em> and <em>conditions</em>. In particular, the <code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_IEEE_Invalid_operation</span></code> <em>signal</em> comprises several <em>conditions</em>.</p> <p>In a signaling function, the <em>status</em> field of the context is updated with all conditions that occurred during the execution. It is never reset automatically, so at any point in a program it contains the cumulative status of all signaling functions.</p> <p>The <em>traps</em> field determines which signals invoke the <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_traphandler</span></code> custom function. By default, this function raises <code class="xref c c-macro docutils literal notranslate"><span class="pre">SIGFPE</span></code>.</p> <p>If a trap occurs, the <em>newtrap</em> field is set to the value of the respective condition. This makes it possible to determine the latest error condition that occurred even when the status has already been βpollutedβ with previous error conditions.</p> <p>Here are the possible <em>signals</em> and <em>conditions</em>:</p> <blockquote> <div><table border="1" class="docutils align-default"> <colgroup> <col width="52%" /> <col width="48%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Signals</th> <th class="head">Conditions</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td rowspan="6"><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_IEEE_Invalid_operation</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Conversion_syntax</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Division_impossible</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Division_undefined</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Invalid_context</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Invalid_operation</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Malloc_error</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Clamped</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Clamped</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Division_by_zero</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Division_by_zero</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Fpu_error</span></code> <a class="footnote-reference" href="#f1" id="id1">[1]</a></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Fpu_error</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Inexact</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Inexact</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Not_implemented</span></code> <a class="footnote-reference" href="#f2" id="id2">[2]</a></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Not_implemented</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Overflow</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Overflow</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Rounded</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Rounded</span></code></td> </tr> <tr class="row-odd"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Subnormal</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Subnormal</span></code></td> </tr> <tr class="row-even"><td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Underflow</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Underflow</span></code></td> </tr> </tbody> </table> <table class="docutils footnote" frame="void" id="f1" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>deprecated, might be renamed to a user-definable signal.</td></tr> </tbody> </table> <table class="docutils footnote" frame="void" id="f2" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td>unused, might be renamed to a user-definable signal.</td></tr> </tbody> </table> </div></blockquote> </div> <div class="section" id="exponent-clamping"> <h2>Exponent Clamping</h2> <p>If the <code class="xref c c-member docutils literal notranslate"><span class="pre">clamp</span></code> field is set to 1, the maximum exponent is reduced to <em>emax</em> - <em>prec</em> + 1. This is compatible with the IEEE 754 decimal interchange formats.</p> </div> <div class="section" id="correct-rounding"> <h2>Correct Rounding</h2> <p>Most functions are correctly-rounded by default. If <em>allcr</em> is set to 1, correct rounding is additionally enabled for <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_exp</span></code>, <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_ln</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_log10</span></code>.</p> <p>In this case, all functions except <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_pow</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_invroot</span></code> return correctly rounded results.</p> </div> </div> <div class="section" id="context-functions"> <h1>Context Functions</h1> <div class="section" id="initialization"> <h2>Initialization</h2> <div class="highlight-c notranslate" id="std:topic-mpd_init"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">mpd_init</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="n">mpd_ssize_t</span> <span class="n">prec</span><span class="p">);</span> </pre></div> </div> <p><em>ctx</em> is initialized by <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_defaultcontext</span></code>, using <em>prec</em>. At the same time, <code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MINALLOC</span></code> is initialized to the ideal value for the given precision. Note that memory usage increases by setting <code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MINALLOC</span></code> to higher values.</p> <p>This function can only be used at program start.</p> <span class="target" id="std:topic-mpd_maxcontext"></span><span class="target" id="std:topic-mpd_defaultcontext"></span><div class="highlight-c notranslate" id="std:topic-mpd_basiccontext"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">mpd_maxcontext</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="kt">void</span> <span class="nf">mpd_defaultcontext</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="kt">void</span> <span class="nf">mpd_basiccontext</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> </pre></div> </div> <p>Initialize the given context. The values for each function:</p> <table border="1" class="docutils align-default"> <colgroup> <col width="10%" /> <col width="29%" /> <col width="29%" /> <col width="32%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head"> </th> <th class="head">maxcontext</th> <th class="head">defaultcontext <a class="footnote-reference" href="#f3" id="id3">[3]</a></th> <th class="head">basiccontext <a class="footnote-reference" href="#f4" id="id4">[4]</a></th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><em>prec</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MAX_PREC</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">2*MPD_RDIGITS</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">9</span></code></td> </tr> <tr class="row-odd"><td><em>emax</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MAX_EMAX</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MAX_EMAX</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MAX_EMAX</span></code></td> </tr> <tr class="row-even"><td><em>emin</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MIN_EMIN</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MIN_EMIN</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_MIN_EMIN</span></code></td> </tr> <tr class="row-odd"><td><em>round</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_EVEN</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_UP</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_UP</span></code></td> </tr> <tr class="row-even"><td><em>traps</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Traps</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Traps</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Traps|MPD_Clamped</span></code></td> </tr> <tr class="row-odd"><td><em>status</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> </tr> <tr class="row-even"><td><em>newtrap</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> </tr> <tr class="row-odd"><td><em>clamp</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> </tr> <tr class="row-even"><td><em>allcr</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> </tr> </tbody> </table> <table class="docutils footnote" frame="void" id="f3" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id3">[3]</a></td><td><strong>libmpdecβs</strong> default context</td></tr> </tbody> </table> <table class="docutils footnote" frame="void" id="f4" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id4">[4]</a></td><td>the specificationβs <em>basic default context</em></td></tr> </tbody> </table> </div> <div class="section" id="ieee-interchange-formats"> <h2>IEEE Interchange Formats</h2> <div class="highlight-c notranslate" id="std:topic-mpd_ieee_context"><div class="highlight"><pre><span></span><span class="n">MPD_IEEE_CONTEXT_MAX_BITS</span> <span class="n">MPD_DECIMAL32</span> <span class="n">MPD_DECIMAL64</span> <span class="n">MPD_DECIMAL128</span> <span class="kt">int</span> <span class="n">mpd_ieee_context</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">bits</span><span class="p">);</span> </pre></div> </div> <p>Initialize the context to the proper values for one of the IEEE interchange formats. The argument must be a multiple of 32 and less than <code class="xref c c-macro docutils literal notranslate"><span class="pre">IEEE_CONTEXT_MAX_BITS</span></code>.</p> <p>For the most common values, the following constants are provided:</p> <table border="1" class="docutils align-default"> <colgroup> <col width="11%" /> <col width="30%" /> <col width="30%" /> <col width="30%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head"> </th> <th class="head"><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_DECIMAL32</span></code></th> <th class="head"><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_DECIMAL64</span></code></th> <th class="head"><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_DECIMAL128</span></code></th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><em>prec</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">7</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">16</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">34</span></code></td> </tr> <tr class="row-odd"><td><em>emax</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">96</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">384</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">6144</span></code></td> </tr> <tr class="row-even"><td><em>emin</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">-95</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">-383</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">-6143</span></code></td> </tr> <tr class="row-odd"><td><em>round</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_EVEN</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_EVEN</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_ROUND_HALF_EVEN</span></code></td> </tr> <tr class="row-even"><td><em>traps</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> </tr> <tr class="row-odd"><td><em>status</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> </tr> <tr class="row-even"><td><em>newtrap</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">0</span></code></td> </tr> <tr class="row-odd"><td><em>clamp</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> </tr> <tr class="row-even"><td><em>allcr</em></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> <td><code class="xref c c-macro docutils literal notranslate"><span class="pre">1</span></code></td> </tr> </tbody> </table> </div> <div class="section" id="getters-and-setters"> <h2>Getters and Setters</h2> <span class="target" id="std:topic-mpd_getprec"></span><span class="target" id="std:topic-mpd_getemax"></span><span class="target" id="std:topic-mpd_getemin"></span><span class="target" id="std:topic-mpd_getround"></span><span class="target" id="std:topic-mpd_gettraps"></span><span class="target" id="std:topic-mpd_getstatus"></span><span class="target" id="std:topic-mpd_getclamp"></span><div class="highlight-c notranslate" id="std:topic-mpd_getcr"><div class="highlight"><pre><span></span><span class="kt">size_t</span> <span class="nf">mpd_getprec</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="n">mpd_ssize_t</span> <span class="nf">mpd_getemax</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="n">mpd_ssize_t</span> <span class="nf">mpd_getemin</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_getround</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="kt">uint32_t</span> <span class="nf">mpd_gettraps</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="kt">uint32_t</span> <span class="nf">mpd_getstatus</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_getclamp</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_getcr</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> </pre></div> </div> <p>Get the individual values.</p> <div class="highlight-c notranslate" id="std:topic-mpd_etiny"><div class="highlight"><pre><span></span><span class="n">mpd_ssize_t</span> <span class="nf">mpd_etiny</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> </pre></div> </div> <p>Return the lowest possible exponent of a subnormal number: <em>emin</em> - <em>prec</em> + 1</p> <div class="highlight-c notranslate" id="std:topic-mpd_etop"><div class="highlight"><pre><span></span><span class="n">mpd_ssize_t</span> <span class="nf">mpd_etop</span><span class="p">(</span><span class="k">const</span> <span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> </pre></div> </div> <p>Return the highest possible exponent of a normal number: <em>emax</em> - <em>prec</em> + 1</p> <p>Only relevant if <em>clamp</em> is set to 1.</p> <span class="target" id="std:topic-mpd_qsetprec"></span><span class="target" id="std:topic-mpd_qsetemax"></span><span class="target" id="std:topic-mpd_qsetemin"></span><span class="target" id="std:topic-mpd_qsetround"></span><span class="target" id="std:topic-mpd_qsettraps"></span><span class="target" id="std:topic-mpd_qsetstatus"></span><span class="target" id="std:topic-mpd_qsetclamp"></span><div class="highlight-c notranslate" id="std:topic-mpd_qsetcr"><div class="highlight"><pre><span></span><span class="kt">int</span> <span class="nf">mpd_qsetprec</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="n">mpd_ssize_t</span> <span class="n">prec</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_qsetemax</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="n">mpd_ssize_t</span> <span class="n">emax</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_qsetemin</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="n">mpd_ssize_t</span> <span class="n">emin</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_qsetround</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">newround</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_qsettraps</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">flags</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_qsetstatus</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">flags</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_qsetclamp</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">c</span><span class="p">);</span> <span class="kt">int</span> <span class="nf">mpd_qsetcr</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">c</span><span class="p">);</span> </pre></div> </div> <p>Quietly set the individual values. These functions check the limits, but they are not foolproof: For example, they still allow setting a <em>prec</em> that does not agree with <em>emax</em>. The functions return 1 on success and 0 on failure. They are quiet since raising an <code class="xref c c-macro docutils literal notranslate"><span class="pre">MPD_Invalid_context</span></code> condition would not make sense in most cases.</p> </div> <div class="section" id="calling-the-trap-handler"> <h2>Calling the Trap Handler</h2> <span class="target" id="std:topic-mpd_addstatus_raise"></span><span class="target" id="std:topic-mpd_dflt_traphandler"></span><div class="highlight-c notranslate" id="std:topic-mpd_traphandler"><div class="highlight"><pre><span></span><span class="k">extern</span> <span class="nf">void</span> <span class="p">(</span><span class="o">*</span> <span class="n">mpd_traphandler</span><span class="p">)(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="p">);</span> <span class="kt">void</span> <span class="nf">mpd_dflt_traphandler</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="p">);</span> <span class="kt">void</span> <span class="nf">mpd_addstatus_raise</span><span class="p">(</span><span class="n">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">flags</span><span class="p">);</span> </pre></div> </div> <p>Add <em>flags</em> to the <em>status</em> field of <em>ctx</em>. If a condition is trapped, set <em>newtrap</em> to the condition and call <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_traphandler</span></code>. By default, <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_traphandler</span></code> is points to <code class="xref c c-func docutils literal notranslate"><span class="pre">mpd_dflt_traphandler</span></code>, which raises <code class="xref c c-macro docutils literal notranslate"><span class="pre">SIGFPE</span></code>.</p> </div> </div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="decimals.html" title="Decimals" >next</a></li> <li class="right" > <a href="functions.html" title="Function Index" >previous</a> |</li> <li><a href="http://www.bytereef.org/mpdecimal/index.html">project home</a></li> </ul> </div> <div class="footer" role="contentinfo"> © Copyright 2010-2020, Stefan Krah. Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4. </div> </body> </html>
Upload File
Create Folder