blob: 55fb0227dc861e44b37837395e9fd42e73e22b30 [file] [log] [blame]
<!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>Various Functions &mdash; 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="Advanced Memory Handling" href="memory.html" />
<link rel="prev" title="Arithmetic Functions" href="arithmetic.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="memory.html" title="Advanced Memory Handling"
accesskey="N">next</a></li>
<li class="right" >
<a href="arithmetic.html" title="Arithmetic Functions"
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="#">Various Functions</a><ul>
<li><a class="reference internal" href="#applying-the-context">Applying the Context</a><ul>
<li><a class="reference internal" href="#finalize">finalize</a></li>
</ul>
</li>
<li><a class="reference internal" href="#nan-handling">NaN Handling</a><ul>
<li><a class="reference internal" href="#check-nan">check-nan</a></li>
<li><a class="reference internal" href="#check-nans">check-nans</a></li>
</ul>
</li>
<li><a class="reference internal" href="#shifting-and-rotating">Shifting and Rotating</a><ul>
<li><a class="reference internal" href="#shift">shift</a></li>
<li><a class="reference internal" href="#shiftn">shiftn</a></li>
<li><a class="reference internal" href="#shiftl">shiftl</a></li>
<li><a class="reference internal" href="#shiftr">shiftr</a></li>
<li><a class="reference internal" href="#shiftr-inplace">shiftr-inplace</a></li>
<li><a class="reference internal" href="#rotate">rotate</a></li>
</ul>
</li>
<li><a class="reference internal" href="#logical-operations">Logical Operations</a><ul>
<li><a class="reference internal" href="#and">and</a></li>
<li><a class="reference internal" href="#or">or</a></li>
<li><a class="reference internal" href="#xor">xor</a></li>
<li><a class="reference internal" href="#invert">invert</a></li>
</ul>
</li>
<li><a class="reference internal" href="#base-conversions">Base Conversions</a><ul>
<li><a class="reference internal" href="#importing">Importing</a></li>
<li><a class="reference internal" href="#exporting">Exporting</a></li>
</ul>
</li>
<li><a class="reference internal" href="#required-functions">Required Functions</a></li>
<li><a class="reference internal" href="#library-version">Library version</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="arithmetic.html"
title="previous chapter">Arithmetic Functions</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="memory.html"
title="next chapter">Advanced Memory Handling</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="various-functions">
<h1>Various Functions</h1>
<div class="section" id="applying-the-context">
<h2>Applying the Context</h2>
<div class="section" id="finalize">
<h3>finalize</h3>
<span class="target" id="std:topic-mpd_qfinalize"></span><div class="highlight-c" id="std:topic-mpd_finalize"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qfinalize</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_finalize</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</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>Apply <em>ctx</em> to <em>result</em>. This function performs checks the exponent limits
and performs rounding. The following conditions can occur:</p>
<p><tt class="xref c c-macro docutils literal"><span class="pre">MPD_Clamped</span></tt>, <tt class="xref c c-macro docutils literal"><span class="pre">MPD_Inexact</span></tt>, <tt class="xref c c-macro docutils literal"><span class="pre">MPD_Overflow</span></tt>,
<tt class="xref c c-macro docutils literal"><span class="pre">MPD_Rounded</span></tt>, <tt class="xref c c-macro docutils literal"><span class="pre">MPD_Subnormal</span></tt>, <tt class="xref c c-macro docutils literal"><span class="pre">MPD_Underflow</span></tt></p>
</div>
</div>
<div class="section" id="nan-handling">
<h2>NaN Handling</h2>
<p>These functions are convenience functions that take care of the elaborate
NaN handling rules. They are meant to be used at the beginning of composite
functions.</p>
<div class="section" id="check-nan">
<h3>check-nan</h3>
<span class="target" id="std:topic-mpd_qcheck_nan"></span><div class="highlight-c" id="std:topic-mpd_check_nan"><div class="highlight"><pre><span class="kt">int</span> <span class="nf">mpd_qcheck_nan</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">int</span> <span class="nf">mpd_check_nan</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</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>If <em>a</em> is NaN or sNaN, set <em>result</em> to qNaN, copy any payload, apply <em>ctx</em>
to the payload and return 1. If <em>a</em> is sNaN, additionally set
<tt class="xref c c-macro docutils literal"><span class="pre">MPD_Invalid_operation</span></tt>.</p>
<p>Otherwise, <em>result</em> is undefined and the return value is 0.</p>
</div>
<div class="section" id="check-nans">
<h3>check-nans</h3>
<span class="target" id="std:topic-mpd_qcheck_nans"></span><div class="highlight-c" id="std:topic-mpd_check_nans"><div class="highlight"><pre><span class="kt">int</span> <span class="nf">mpd_qcheck_nans</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">int</span> <span class="nf">mpd_check_nans</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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>If either operand is NaN or sNaN, apply the precedence rules, set <em>result</em>
to qNaN, copy any payload, apply <em>ctx</em> to the payload and return 1. If
one of the operands is sNaN, additionally set <tt class="xref c c-macro docutils literal"><span class="pre">MPD_Invalid_operation</span></tt>.</p>
<p>Otherwise, <em>result</em> is undefined and the return value is 0.</p>
</div>
</div>
<div class="section" id="shifting-and-rotating">
<h2>Shifting and Rotating</h2>
<span class="target" id="std:topic-mpd_qshift"></span><div class="section" id="shift">
<span id="std:topic-mpd_shift"></span><h3>shift</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qshift</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_shift</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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>Set <em>result</em> to <em>a</em> shifted by <em>b</em> places. <em>b</em> must be in the range
[<em>-prec</em>, <em>prec</em>]. A negative <em>b</em> indicates a right shift, a positive
<em>b</em> a left shift. Digits that do not fit are discarded.</p>
<span class="target" id="std:topic-mpd_qshiftn"></span></div>
<div class="section" id="shiftn">
<span id="std:topic-mpd_shiftn"></span><h3>shiftn</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qshiftn</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">mpd_ssize_t</span> <span class="n">n</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_shiftn</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">mpd_ssize_t</span> <span class="n">n</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>Like <tt class="xref c c-func docutils literal"><span class="pre">mpd_qshift</span></tt>, only that the number of places is specified by a
C integer type rather than a decimal. This function is not part of the
specification.</p>
<span class="target" id="std:topic-mpd_qshiftl"></span></div>
<div class="section" id="shiftl">
<span id="std:topic-mpd_shiftl"></span><h3>shiftl</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">int</span> <span class="nf">mpd_qshiftl</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">mpd_ssize_t</span> <span class="n">n</span><span class="p">,</span>
<span class="kt">uint32_t</span> <span class="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_shiftl</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">mpd_ssize_t</span> <span class="n">n</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>Set <em>result</em> to <em>a</em>, shifted by <em>n</em> places to the left. <em>a</em> must not be
a special number. Digits are never discarded, so the coefficient of
<em>result</em> might exceed <em>prec</em>. Return 1 on success. On failure, return 0
and add <tt class="xref c c-macro docutils literal"><span class="pre">MPD_Malloc_error</span></tt> to <em>status</em>.</p>
<p>This function is not part of the specification.</p>
<span class="target" id="std:topic-mpd_qshiftr"></span></div>
<div class="section" id="shiftr">
<span id="std:topic-mpd_shiftr"></span><h3>shiftr</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">mpd_uint_t</span> <span class="nf">mpd_qshiftr</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">mpd_ssize_t</span> <span class="n">n</span><span class="p">,</span>
<span class="kt">uint32_t</span> <span class="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">mpd_uint_t</span> <span class="nf">mpd_shiftr</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">mpd_ssize_t</span> <span class="n">n</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>Set <em>result</em> to <em>a</em>, shifted by <em>n</em> places to the right. <em>a</em> must not be
a special number. On success, return the digit relevant for rounding.
On failure, return <tt class="xref c c-macro docutils literal"><span class="pre">MPD_UINT_MAX</span></tt> and add <tt class="xref c c-macro docutils literal"><span class="pre">MPD_Malloc_error</span></tt>
to <em>status</em>.</p>
<p>This function is not part of the specification.</p>
</div>
<div class="section" id="shiftr-inplace">
<span id="std:topic-mpd_qshiftr_inplace"></span><h3>shiftr-inplace</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">mpd_uint_t</span> <span class="n">mpd_qshiftr_inplace</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="kt">mpd_ssize_t</span> <span class="n">n</span><span class="p">)</span>
</pre></div>
</div>
<p>Like <tt class="xref c c-func docutils literal"><span class="pre">mpd_qshiftr</span></tt>, but shifts <em>result</em> in place. <em>result</em>
must not be a special number. This function cannot fail.</p>
</div>
<div class="section" id="rotate">
<h3>rotate</h3>
<span class="target" id="std:topic-mpd_qrotate"></span><div class="highlight-c" id="std:topic-mpd_rotate"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qrotate</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_rotate</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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>Set <em>result</em> to <em>a</em> rotated by <em>b</em> places. <em>b</em> must be in the range [<em>-prec</em>, <em>prec</em>].
A negative <em>b</em> indicates a right rotation, a positive <em>b</em> a left rotation.</p>
</div>
</div>
<div class="section" id="logical-operations">
<h2>Logical Operations</h2>
<p>Logical operands are finite numbers with a sign of 0, an exponent of 0 and
a coefficient consisting only of ones and zeros.</p>
<span class="target" id="std:topic-mpd_qand"></span><div class="section" id="and">
<span id="std:topic-mpd_and"></span><h3>and</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qand</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_and</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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>Set <em>result</em> to the digit-wise <em>logical and</em> of <em>a</em> and <em>b</em>.</p>
<span class="target" id="std:topic-mpd_qor"></span></div>
<div class="section" id="or">
<span id="std:topic-mpd_or"></span><h3>or</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qor</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_or</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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>Set <em>result</em> to the digit-wise <em>logical or</em> of <em>a</em> and <em>b</em>.</p>
<span class="target" id="std:topic-mpd_qxor"></span></div>
<div class="section" id="xor">
<span id="std:topic-mpd_xor"></span><h3>xor</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qxor</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_xor</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">b</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>Set <em>result</em> to the digit-wise <em>logical xor</em> of <em>a</em> and <em>b</em>.</p>
<span class="target" id="std:topic-mpd_qinvert"></span></div>
<div class="section" id="invert">
<span id="std:topic-mpd_invert"></span><h3>invert</h3>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qinvert</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_invert</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</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>Set <em>result</em> to the digit-wise <em>logical inversion</em> of <em>a</em>.</p>
</div>
</div>
<div class="section" id="base-conversions">
<h2>Base Conversions</h2>
<p>Functions for converting decimals to multi-precision integers and vice
versa. Decimals that are exported must be integers.</p>
<div class="section" id="importing">
<h3>Importing</h3>
<span class="target" id="std:topic-mpd_qimport_u16"></span><div class="highlight-c" id="std:topic-mpd_import_u16"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qimport_u16</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">uint16_t</span> <span class="o">*</span><span class="n">srcdata</span><span class="p">,</span>
<span class="kt">size_t</span> <span class="n">srclen</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">srcsign</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">srcbase</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_import_u16</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">uint16_t</span> <span class="o">*</span><span class="n">srcdata</span><span class="p">,</span>
<span class="kt">size_t</span> <span class="n">srclen</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">srcsign</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">srcbase</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>Convert a multi-precision integer at <em>srcdata</em> with base <em>srcbase</em> to a
decimal. The least significant word is <em>srcdata</em>[0].</p>
<p><em>srcsign</em> is <tt class="xref c c-macro docutils literal"><span class="pre">MPD_POS</span></tt> for positive and <tt class="xref c c-macro docutils literal"><span class="pre">MPD_NEG</span></tt> for
negative, <em>srclen</em> the length of <em>srcdata</em>.</p>
<p>Valid bases are in the range 2 &lt;= <em>srcbase</em> &lt;= <tt class="xref c c-macro docutils literal"><span class="pre">UINT16_MAX</span></tt> + 1.</p>
<span class="target" id="std:topic-mpd_qimport_u32"></span><div class="highlight-c" id="std:topic-mpd_import_u32"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_qimport_u32</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">srcdata</span><span class="p">,</span>
<span class="kt">size_t</span> <span class="n">srclen</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">srcsign</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">srcbase</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="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">mpd_import_u32</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">srcdata</span><span class="p">,</span>
<span class="kt">size_t</span> <span class="n">srclen</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">srcsign</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">base</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>Convert a multi-precision integer at <em>srcdata</em> with base <em>srcbase</em> to a
decimal. The least significant word is <em>srcdata</em>[0].</p>
<p><em>srcsign</em> is <tt class="xref c c-macro docutils literal"><span class="pre">MPD_POS</span></tt> for positive and <tt class="xref c c-macro docutils literal"><span class="pre">MPD_NEG</span></tt> for
negative, <em>srclen</em> the length of <em>srcdata</em>.</p>
<p>Valid bases are in the range 2 &lt;= <em>srcbase</em> &lt;= <tt class="xref c c-macro docutils literal"><span class="pre">UINT32_MAX</span></tt>.</p>
</div>
<div class="section" id="exporting">
<h3>Exporting</h3>
<div class="highlight-c" id="std:topic-mpd_sizeinbase"><div class="highlight"><pre><span class="n">mpd_sizeinbase</span><span class="p">(</span><span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">base</span><span class="p">);</span>
</pre></div>
</div>
<p>Return the number of words needed to represent a decimal when converted
to <em>base</em>. The decimal <em>must be an integer</em>, results are undefined for
non-integers.</p>
<span class="target" id="std:topic-mpd_qexport_u16"></span><div class="highlight-c" id="std:topic-mpd_export_u16"><div class="highlight"><pre><span class="kt">size_t</span> <span class="nf">mpd_qexport_u16</span><span class="p">(</span><span class="kt">uint16_t</span> <span class="o">**</span><span class="n">rdata</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">rlen</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">rbase</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">src</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">size_t</span> <span class="nf">mpd_export_u16</span><span class="p">(</span><span class="kt">uint16_t</span> <span class="o">**</span><span class="n">rdata</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">rlen</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">rbase</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">src</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>Set <em>*rdata</em> to <em>src</em>, converted to a representation in base <em>rbase</em>.
The least significant word of the result is <em>rdata</em>[0]. <em>src</em> must be
an integer.</p>
<p>If <em>rdata</em> is NULL, space is allocated by the function and <em>rlen</em> is
irrelevant. In case of an error the allocated storage is freed and
rdata is set back to NULL.</p>
<p>If <em>rdata</em> is non-NULL, it <em>MUST</em> be allocated by one of libmpdec&#8217;s
allocation functions and <em>rlen</em> <em>MUST</em> be correct. If necessary, the
function will resize <em>rdata</em>. Resizing is slow and should not occur
if <em>rlen</em> has been obtained by a call to <tt class="xref c c-func docutils literal"><span class="pre">mpd_sizeinbase</span></tt>.
In case of an error the caller must free <em>rdata</em>.</p>
<p>Return value: In case of success, the length of the multi-precision integer
in the new base, <tt class="xref c c-macro docutils literal"><span class="pre">SIZE_MAX</span></tt> otherwise.</p>
<p>Valid bases are in the range 2 &lt;= <em>rbase</em> &lt;= <tt class="xref c c-macro docutils literal"><span class="pre">UINT16_MAX</span></tt> + 1.</p>
<div class="versionchanged">
<p><span class="versionmodified">Changed in version 2.4: </span><em>rdata</em> is now resized if necessary.</p>
</div>
<span class="target" id="std:topic-mpd_qexport_u32"></span><div class="highlight-c" id="std:topic-mpd_export_u32"><div class="highlight"><pre><span class="kt">size_t</span> <span class="nf">mpd_qexport_u32</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="o">*</span><span class="n">rdata</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">rlen</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">rbase</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">src</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">status</span><span class="p">);</span>
<span class="kt">size_t</span> <span class="nf">mpd_export_u32</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="o">*</span><span class="n">rdata</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">rlen</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">rbase</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">src</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>Set <em>*rdata</em> to <em>src</em>, converted to a representation in base <em>rbase</em>.
The least significant word of the result is <em>rdata</em>[0]. <em>src</em> must be
an integer.</p>
<p>If <em>rdata</em> is NULL, space is allocated by the function and <em>rlen</em> is
irrelevant. In case of an error the allocated storage is freed and
rdata is set back to NULL.</p>
<p>If <em>rdata</em> is non-NULL, it <em>MUST</em> be allocated by one of libmpdec&#8217;s
allocation functions and <em>rlen</em> <em>MUST</em> be correct. If necessary, the
function will resize <em>rdata</em>. Resizing is slow and should not occur if
<em>rlen</em> has been obtained by a call to <tt class="xref c c-func docutils literal"><span class="pre">mpd_sizeinbase</span></tt>. In case
of an error the caller must free <em>rdata</em>.</p>
<p>Return value: In case of success, the length of the multi-precision integer
in the new base, <tt class="xref c c-macro docutils literal"><span class="pre">SIZE_MAX</span></tt> otherwise.</p>
<p>Valid bases are in the range 2 &lt;= <em>rbase</em> &lt;= <tt class="xref c c-macro docutils literal"><span class="pre">UINT32_MAX</span></tt>.</p>
<div class="versionchanged">
<p><span class="versionmodified">Changed in version 2.4: </span><em>rdata</em> is now resized if necessary.</p>
</div>
</div>
</div>
<div class="section" id="required-functions">
<h2>Required Functions</h2>
<p>The functions in this section are not needed for this implementation.
They are provided for full compliance with the specification.</p>
<div class="highlight-c" id="std:topic-mpd_canonical"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">mpd_canonical</span><span class="p">(</span><span class="kt">mpd_t</span> <span class="o">*</span><span class="n">result</span><span class="p">,</span> <span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">a</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>Same as <tt class="xref c c-func docutils literal"><span class="pre">mpd_copy</span></tt>.</p>
<div class="highlight-c" id="std:topic-mpd_iscanonical"><div class="highlight"><pre><span class="kt">int</span> <span class="nf">mpd_iscanonical</span><span class="p">(</span><span class="k">const</span> <span class="kt">mpd_t</span> <span class="o">*</span><span class="n">dec</span><span class="p">);</span>
</pre></div>
</div>
<p>Return 1, for compatibility with the standard.</p>
<div class="highlight-c" id="std:topic-mpd_radix"><div class="highlight"><pre><span class="kt">long</span> <span class="nf">mpd_radix</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span>
</pre></div>
</div>
<p>Return 10.</p>
</div>
<div class="section" id="library-version">
<h2>Library version</h2>
<div class="highlight-c" id="std:topic-mpd_version"><div class="highlight"><pre><span class="cm">/* Macros defining the components of the version as integers. */</span>
<span class="n">MPD_MAJOR_VERSION</span>
<span class="n">MPD_MINOR_VERSION</span>
<span class="n">MPD_MICRO_VERSION</span>
<span class="cm">/* Macro defining the complete version as a string. */</span>
<span class="n">MPD_VERSION</span>
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">mpd_version</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span>
</pre></div>
</div>
<p>Library version information. <tt class="xref c c-func docutils literal"><span class="pre">mpd_version</span></tt> returns the MPD_VERSION macro
from the header that the library was compiled with.</p>
<div class="versionadded">
<p><span class="versionmodified">New in version 2.4.</span></p>
</div>
</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="memory.html" title="Advanced Memory Handling"
>next</a></li>
<li class="right" >
<a href="arithmetic.html" title="Arithmetic Functions"
>previous</a> |</li>
<li><a href="http://www.bytereef.org/mpdecimal/index.html">project home</a></li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2010-2016, Stefan Krah.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.
</div>
</body>
</html>