| <!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="Content-Type" content="text/html; charset=utf-8" /> |
| <meta content="index,follow" name="robots" /> |
| <meta content="libmpdec documentation" name="description" /> |
| |
| <title>Context — mpdecimal 2.4.0 documentation</title> |
| |
| <link rel="stylesheet" href="_static/mpdecimal-doc.css" type="text/css" /> |
| <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> |
| |
| <script type="text/javascript"> |
| var DOCUMENTATION_OPTIONS = { |
| URL_ROOT: './', |
| VERSION: '2.4.0', |
| COLLAPSE_INDEX: false, |
| FILE_SUFFIX: '.html', |
| HAS_SOURCE: false |
| }; |
| </script> |
| <script type="text/javascript" src="_static/jquery.js"></script> |
| <script type="text/javascript" src="_static/underscore.js"></script> |
| <script type="text/javascript" src="_static/doctools.js"></script> |
| <link rel="top" title="mpdecimal 2.4.0 documentation" href="index.html" /> |
| <link rel="next" title="Decimals" href="decimals.html" /> |
| <link rel="prev" title="Function Index" href="functions.html" /> |
| </head> |
| <body> |
| <div class="related"> |
| <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"> |
| <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"> |
| <h3>Quick search</h3> |
| <form class="search" action="search.html" method="get"> |
| <input type="text" name="q" /> |
| <input type="submit" value="Go" /> |
| <input type="hidden" name="check_keywords" value="yes" /> |
| <input type="hidden" name="area" value="default" /> |
| </form> |
| <p class="searchtip" style="font-size: 90%"> |
| Enter search terms or a module, class or function name. |
| </p> |
| </div> |
| <script type="text/javascript">$('#searchbox').show(0);</script> |
| </div> |
| </div> |
| |
| <div class="document"> |
| <div class="documentwrapper"> |
| <div class="bodywrapper"> |
| <div class="body"> |
| |
| <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"><div class="highlight"><pre><span class="cp">#include <mpdecimal.h></span> |
| |
| |
| <span class="k">typedef</span> <span class="k">struct</span> <span class="kt">mpd_context_t</span> <span class="p">{</span> |
| <span class="kt">mpd_ssize_t</span> <span class="n">prec</span><span class="p">;</span> <span class="c1">// precision</span> |
| <span class="kt">mpd_ssize_t</span> <span class="n">emax</span><span class="p">;</span> <span class="c1">// max positive exp</span> |
| <span class="kt">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="kt">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"> |
| <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><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MAX_PREC</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">425000000</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">999999999999999999</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MAX_EMAX</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">425000000</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">999999999999999999</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MIN_EMIN</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">-425000000</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">-999999999999999999</span></tt></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"> |
| <colgroup> |
| <col width="24%" /> |
| <col width="76%" /> |
| </colgroup> |
| <tbody valign="top"> |
| <tr class="row-odd"><td><em>prec</em></td> |
| <td>[<tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt>, <tt class="xref c c-macro docutils literal"><span class="pre">MPD_MAX_PREC</span></tt>]</td> |
| </tr> |
| <tr class="row-even"><td><em>emax</em></td> |
| <td>[<tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt>, <tt class="xref c c-macro docutils literal"><span class="pre">MPD_MAX_EMAX</span></tt>]</td> |
| </tr> |
| <tr class="row-odd"><td><em>emin</em></td> |
| <td>[<tt class="xref c c-macro docutils literal"><span class="pre">MPD_MIN_EMIN</span></tt>, <tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt>]</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"> |
| <colgroup> |
| <col width="42%" /> |
| <col width="58%" /> |
| </colgroup> |
| <tbody valign="top"> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_UP</span></tt></td> |
| <td>round away from <tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_DOWN</span></tt></td> |
| <td>round toward <tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt> (truncate)</td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_CEILING</span></tt></td> |
| <td>round toward <tt class="xref c c-macro docutils literal"><span class="pre">+infinity</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_FLOOR</span></tt></td> |
| <td>round toward <tt class="xref c c-macro docutils literal"><span class="pre">-infinity</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_UP</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0.5</span></tt> is rounded up</td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_DOWN</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0.5</span></tt> is rounded down</td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_EVEN</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0.5</span></tt> is rounded to even</td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_05UP</span></tt></td> |
| <td>round zero or five away from <tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_TRUNC</span></tt></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 <tt class="xref c c-macro docutils literal"><span class="pre">MPD_IEEE_Invalid_operation</span></tt> <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 <tt class="xref c c-func docutils literal"><span class="pre">mpd_traphandler</span></tt> |
| custom function. By default, this function raises <tt class="xref c c-macro docutils literal"><span class="pre">SIGFPE</span></tt>.</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"> |
| <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"><tt class="xref c c-macro docutils literal"><span class="pre">MPD_IEEE_Invalid_operation</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Conversion_syntax</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Division_impossible</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Division_undefined</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Invalid_context</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Invalid_operation</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Malloc_error</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Clamped</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Clamped</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Division_by_zero</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Division_by_zero</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Fpu_error</span></tt> <a class="footnote-reference" href="#f1" id="id1">[1]</a></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Fpu_error</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Inexact</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Inexact</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Not_implemented</span></tt> <a class="footnote-reference" href="#f2" id="id2">[2]</a></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Not_implemented</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Overflow</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Overflow</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Rounded</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Rounded</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Subnormal</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Subnormal</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Underflow</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Underflow</span></tt></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 <tt class="xref c c-member docutils literal"><span class="pre">clamp</span></tt> 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 <tt class="xref c c-func docutils literal"><span class="pre">mpd_exp</span></tt>, |
| <tt class="xref c c-func docutils literal"><span class="pre">mpd_ln</span></tt> and <tt class="xref c c-func docutils literal"><span class="pre">mpd_log10</span></tt>.</p> |
| <p>In this case, all functions except <tt class="xref c c-func docutils literal"><span class="pre">mpd_pow</span></tt> and <tt class="xref c c-func docutils literal"><span class="pre">mpd_invroot</span></tt> |
| 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" id="std:topic-mpd_init"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_init</span><span class="p">(</span><span class="kt">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">mpd_ssize_t</span> <span class="n">prec</span><span class="p">);</span> |
| </pre></div> |
| </div> |
| <p><em>ctx</em> is initialized by <tt class="xref c c-func docutils literal"><span class="pre">mpd_defaultcontext</span></tt>, using <em>prec</em>. |
| At the same time, <tt class="xref c c-macro docutils literal"><span class="pre">MPD_MINALLOC</span></tt> is initialized to the ideal |
| value for the given precision. Note that memory usage increases by |
| setting <tt class="xref c c-macro docutils literal"><span class="pre">MPD_MINALLOC</span></tt> 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" id="std:topic-mpd_basiccontext"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_maxcontext</span><span class="p">(</span><span class="kt">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="kt">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="kt">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"> |
| <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><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MAX_PREC</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">2*MPD_RDIGITS</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">9</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><em>emax</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MAX_EMAX</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MAX_EMAX</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MAX_EMAX</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><em>emin</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MIN_EMIN</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MIN_EMIN</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_MIN_EMIN</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><em>round</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_EVEN</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_UP</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_UP</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><em>traps</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Traps</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Traps</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Traps|MPD_Clamped</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><em>status</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><em>newtrap</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><em>clamp</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><em>allcr</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></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" id="std:topic-mpd_ieee_context"><div class="highlight"><pre><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="nf">mpd_ieee_context</span><span class="p">(</span><span class="kt">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 |
| <tt class="xref c c-macro docutils literal"><span class="pre">IEEE_CONTEXT_MAX_BITS</span></tt>.</p> |
| <p>For the most common values, the following constants are provided:</p> |
| <table border="1" class="docutils"> |
| <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"><tt class="xref c c-macro docutils literal"><span class="pre">MPD_DECIMAL32</span></tt></th> |
| <th class="head"><tt class="xref c c-macro docutils literal"><span class="pre">MPD_DECIMAL64</span></tt></th> |
| <th class="head"><tt class="xref c c-macro docutils literal"><span class="pre">MPD_DECIMAL128</span></tt></th> |
| </tr> |
| </thead> |
| <tbody valign="top"> |
| <tr class="row-even"><td><em>prec</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">7</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">16</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">34</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><em>emax</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">96</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">384</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">6144</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><em>emin</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">-95</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">-383</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">-6143</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><em>round</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_EVEN</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_EVEN</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">MPD_ROUND_HALF_EVEN</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><em>traps</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><em>status</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><em>newtrap</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">0</span></tt></td> |
| </tr> |
| <tr class="row-odd"><td><em>clamp</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></td> |
| </tr> |
| <tr class="row-even"><td><em>allcr</em></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></td> |
| <td><tt class="xref c c-macro docutils literal"><span class="pre">1</span></tt></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" id="std:topic-mpd_getcr"><div class="highlight"><pre><span class="kt">size_t</span> <span class="nf">mpd_getprec</span><span class="p">(</span><span class="k">const</span> <span class="kt">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> |
| <span class="kt">mpd_ssize_t</span> <span class="nf">mpd_getemax</span><span class="p">(</span><span class="k">const</span> <span class="kt">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">);</span> |
| <span class="kt">mpd_ssize_t</span> <span class="nf">mpd_getemin</span><span class="p">(</span><span class="k">const</span> <span class="kt">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="kt">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="kt">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="kt">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="kt">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="kt">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" id="std:topic-mpd_etiny"><div class="highlight"><pre><span class="kt">mpd_ssize_t</span> <span class="nf">mpd_etiny</span><span class="p">(</span><span class="k">const</span> <span class="kt">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" id="std:topic-mpd_etop"><div class="highlight"><pre><span class="kt">mpd_ssize_t</span> <span class="nf">mpd_etop</span><span class="p">(</span><span class="k">const</span> <span class="kt">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" id="std:topic-mpd_qsetcr"><div class="highlight"><pre><span class="kt">int</span> <span class="nf">mpd_qsetprec</span><span class="p">(</span><span class="kt">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">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="kt">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">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="kt">mpd_context_t</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">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="kt">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="kt">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="kt">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="kt">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="kt">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 <tt class="xref c c-macro docutils literal"><span class="pre">MPD_Invalid_context</span></tt> 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" id="std:topic-mpd_traphandler"><div class="highlight"><pre><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="kt">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="kt">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="kt">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 <tt class="xref c c-func docutils literal"><span class="pre">mpd_traphandler</span></tt>. By default, |
| <tt class="xref c c-func docutils literal"><span class="pre">mpd_traphandler</span></tt> is points to <tt class="xref c c-func docutils literal"><span class="pre">mpd_dflt_traphandler</span></tt>, which |
| raises <tt class="xref c c-macro docutils literal"><span class="pre">SIGFPE</span></tt>.</p> |
| </div> |
| </div> |
| |
| |
| </div> |
| </div> |
| </div> |
| <div class="clearer"></div> |
| </div> |
| <div class="related"> |
| <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"> |
| © Copyright 2010-2016, Stefan Krah. |
| Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2. |
| </div> |
| </body> |
| </html> |