bigint.html

来自「perl教程」· HTML 代码 · 共 275 行

HTML
275
字号
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../displayToc.js"></script>
<script language="JavaScript" src="../tocParas.js"></script>
<script language="JavaScript" src="../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../scineplex.css">
<title>bigint - Transparent BigInteger support for Perl</title>
<link rel="stylesheet" href="../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>

<body>

<script>writelinks('__top__',1);</script>
<h1><a>bigint - Transparent BigInteger support for Perl</a></h1>
<p><a name="__index__"></a></p>

<!-- INDEX BEGIN -->

<ul>

	<li><a href="#name">NAME</a></li>
	<li><a href="#synopsis">SYNOPSIS</a></li>
	<li><a href="#description">DESCRIPTION</a></li>
	<ul>

		<li><a href="#options">Options</a></li>
		<li><a href="#math_library">Math Library</a></li>
		<li><a href="#internal_format">Internal Format</a></li>
		<li><a href="#sign">Sign</a></li>
		<li><a href="#methods">Methods</a></li>
		<li><a href="#caveat">Caveat</a></li>
	</ul>

	<li><a href="#modules_used">MODULES USED</a></li>
	<li><a href="#examples">EXAMPLES</a></li>
	<li><a href="#license">LICENSE</a></li>
	<li><a href="#see_also">SEE ALSO</a></li>
	<li><a href="#authors">AUTHORS</a></li>
</ul>
<!-- INDEX END -->

<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>bigint - Transparent BigInteger support for Perl</p>
<p>
</p>
<hr />
<h1><a name="synopsis">SYNOPSIS</a></h1>
<pre>
  <span class="keyword">use</span> <span class="variable">bigint</span><span class="operator">;</span>
</pre>
<pre>
  <span class="variable">$x</span> <span class="operator">=</span> <span class="number">2</span> <span class="operator">+</span> <span class="number">4.5</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>                    <span class="comment"># BigInt 6</span>
  <span class="keyword">print</span> <span class="number">2</span> <span class="operator">**</span> <span class="number">512</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>                  <span class="comment"># really is what you think it is</span>
  <span class="keyword">print</span> <span class="variable">inf</span> <span class="operator">+</span> <span class="number">42</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>                  <span class="comment"># inf</span>
  <span class="keyword">print</span> <span class="variable">NaN</span> <span class="operator">*</span> <span class="number">7</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>                   <span class="comment"># NaN</span>
</pre>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>All operators (including basic math operations) are overloaded. Integer
constants are created as proper BigInts.</p>
<p>Floating point constants are truncated to integer. All results are also
truncated.</p>
<p>
</p>
<h2><a name="options">Options</a></h2>
<p>bigint recognizes some options that can be passed while loading it via use.
The options can (currently) be either a single letter form, or the long form.
The following options exist:</p>
<dl>
<dt><strong><a name="item_a_or_accuracy">a or accuracy</a></strong>

<dd>
<p>This sets the accuracy for all math operations. The argument must be greater
than or equal to zero. See Math::BigInt's <code>bround()</code> function for details.</p>
</dd>
<dd>
<pre>
        perl -Mbigint=a,2 -le 'print 12345+1'</pre>
</dd>
</li>
<dt><strong><a name="item_p_or_precision">p or precision</a></strong>

<dd>
<p>This sets the precision for all math operations. The argument can be any
integer. Negative values mean a fixed number of digits after the dot, and
are &lt;B&gt;ignored&lt;/B&gt; since all operations happen in integer space.
A positive value rounds to this digit left from the dot. 0 or 1 mean round to
integer and are ignore like negative values.</p>
</dd>
<dd>
<p>See Math::BigInt's <code>bfround()</code> function for details.</p>
</dd>
<dd>
<pre>
        perl -Mbignum=p,5 -le 'print 123456789+123'</pre>
</dd>
</li>
<dt><strong><a name="item_t_or_trace">t or trace</a></strong>

<dd>
<p>This enables a trace mode and is primarily for debugging bigint or
Math::BigInt.</p>
</dd>
</li>
<dt><strong><a name="item_l_or_lib">l or lib</a></strong>

<dd>
<p>Load a different math lib, see <a href="#math_library">MATH LIBRARY</a>.</p>
</dd>
<dd>
<pre>
        perl -Mbigint=l,GMP -e 'print 2 ** 512'</pre>
</dd>
<dd>
<p>Currently there is no way to specify more than one library on the command
line. This will be hopefully fixed soon ;)</p>
</dd>
</li>
<dt><strong><a name="item_v_or_version">v or version</a></strong>

<dd>
<p>This prints out the name and version of all modules used and then exits.</p>
</dd>
<dd>
<pre>
        perl -Mbigint=v</pre>
</dd>
</li>
</dl>
<p>
</p>
<h2><a name="math_library">Math Library</a></h2>
<p>Math with the numbers is done (by default) by a module called
Math::BigInt::Calc. This is equivalent to saying:</p>
<pre>
        <span class="keyword">use</span> <span class="variable">bigint</span> <span class="string">lib</span> <span class="operator">=&gt;</span> <span class="string">'Calc'</span><span class="operator">;</span>
</pre>
<p>You can change this by using:</p>
<pre>
        <span class="keyword">use</span> <span class="variable">bigint</span> <span class="string">lib</span> <span class="operator">=&gt;</span> <span class="string">'BitVect'</span><span class="operator">;</span>
</pre>
<p>The following would first try to find Math::BigInt::Foo, then
Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:</p>
<pre>
        <span class="keyword">use</span> <span class="variable">bigint</span> <span class="string">lib</span> <span class="operator">=&gt;</span> <span class="string">'Foo,Math::BigInt::Bar'</span><span class="operator">;</span>
</pre>
<p>Please see respective module documentation for further details.</p>
<p>
</p>
<h2><a name="internal_format">Internal Format</a></h2>
<p>The numbers are stored as objects, and their internals might change at anytime,
especially between math operations. The objects also might belong to different
classes, like Math::BigInt, or Math::BigInt::Lite. Mixing them together, even
with normal scalars is not extraordinary, but normal and expected.</p>
<p>You should not depend on the internal format, all accesses must go through
accessor methods. E.g. looking at $x-&gt;{sign} is not a good idea since there
is no guaranty that the object in question has such a hash key, nor is a hash
underneath at all.</p>
<p>
</p>
<h2><a name="sign">Sign</a></h2>
<p>The sign is either '+', '-', 'NaN', '+inf' or '-inf'.
You can access it with the <code>sign()</code> method.</p>
<p>A sign of 'NaN' is used to represent the result when input arguments are not
numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
minus infinity. You will get '+inf' when dividing a positive number by 0, and
'-inf' when dividing any negative number by 0.</p>
<p>
</p>
<h2><a name="methods">Methods</a></h2>
<p>Since all numbers are now objects, you can use all functions that are part of
the BigInt API. You can only use the <code>bxxx()</code> notation, and not the <code>fxxx()</code>
notation, though.</p>
<p>
</p>
<h2><a name="caveat">Caveat</a></h2>
<p>But a warning is in order. When using the following to make a copy of a number,
only a shallow copy will be made.</p>
<pre>
        <span class="variable">$x</span> <span class="operator">=</span> <span class="number">9</span><span class="operator">;</span> <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">;</span>
        <span class="variable">$x</span> <span class="operator">=</span> <span class="variable">$y</span> <span class="operator">=</span> <span class="number">7</span><span class="operator">;</span>
</pre>
<p>Using the copy or the original with overloaded math is okay, e.g. the
following work:</p>
<pre>
        <span class="variable">$x</span> <span class="operator">=</span> <span class="number">9</span><span class="operator">;</span> <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">;</span>
        <span class="keyword">print</span> <span class="variable">$x</span> <span class="operator">+</span> <span class="number">1</span><span class="operator">,</span> <span class="string">" "</span><span class="operator">,</span> <span class="variable">$y</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>     <span class="comment"># prints 10 9</span>
</pre>
<p>but calling any method that modifies the number directly will result in
<strong>both</strong> the original and the copy beeing destroyed:</p>
<pre>

        <span class="variable">$x</span> <span class="operator">=</span> <span class="number">9</span><span class="operator">;</span> <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">;</span>
        <span class="keyword">print</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">badd</span><span class="operator">(</span><span class="number">1</span><span class="operator">),</span> <span class="string">" "</span><span class="operator">,</span> <span class="variable">$y</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>        <span class="comment"># prints 10 10</span>
</pre>
<pre>

        <span class="variable">$x</span> <span class="operator">=</span> <span class="number">9</span><span class="operator">;</span> <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">;</span>
        <span class="keyword">print</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">binc</span><span class="operator">(</span><span class="number">1</span><span class="operator">),</span> <span class="string">" "</span><span class="operator">,</span> <span class="variable">$y</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>        <span class="comment"># prints 10 10</span>
</pre>
<pre>

        <span class="variable">$x</span> <span class="operator">=</span> <span class="number">9</span><span class="operator">;</span> <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">;</span>
        <span class="keyword">print</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bmul</span><span class="operator">(</span><span class="number">2</span><span class="operator">),</span> <span class="string">" "</span><span class="operator">,</span> <span class="variable">$y</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>        <span class="comment"># prints 18 18</span>
</pre>
<pre>

Using methods that do not modify, but testthe contents works:</pre>
<pre>
        <span class="variable">$x</span> <span class="operator">=</span> <span class="number">9</span><span class="operator">;</span> <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">;</span>
        <span class="variable">$z</span> <span class="operator">=</span> <span class="number">9</span> <span class="keyword">if</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">is_zero</span><span class="operator">();</span>                <span class="comment"># works fine</span>
</pre>
<p>See the documentation about the copy constructor and <code>=</code> in overload, as
well as the documentation in BigInt for further details.</p>
<p>
</p>
<hr />
<h1><a name="modules_used">MODULES USED</a></h1>
<p><code>bigint</code> is just a thin wrapper around various modules of the Math::BigInt
family. Think of it as the head of the family, who runs the shop, and orders
the others to do the work.</p>
<p>The following modules are currently used by bigint:</p>
<pre>
        Math::BigInt::Lite      (for speed, and only if it is loadable)
        Math::BigInt</pre>
<p>
</p>
<hr />
<h1><a name="examples">EXAMPLES</a></h1>
<p>Some cool command line examples to impress the Python crowd ;) You might want
to compare them to the results under -Mbignum or -Mbigrat:</p>
<pre>

        perl -Mbigint -le 'print sqrt(33)'
        perl -Mbigint -le 'print 2*255'
        perl -Mbigint -le 'print 4.5+2*255'
        perl -Mbigint -le 'print 3/7 + 5/7 + 8/3'
        perl -Mbigint -le 'print 123-&gt;is_odd()'
        perl -Mbigint -le 'print log(2)'
        perl -Mbigint -le 'print 2 ** 0.5'
        perl -Mbigint=a,65 -le 'print 2 ** 0.2'</pre>
<p>
</p>
<hr />
<h1><a name="license">LICENSE</a></h1>
<p>This program is free software; you may redistribute it and/or modify it under
the same terms as Perl itself.</p>
<p>
</p>
<hr />
<h1><a name="see_also">SEE ALSO</a></h1>
<p>Especially <a href="../lib/bigrat.html">the bigrat manpage</a> as in <code>perl -Mbigrat -le 'print 1/3+1/4'</code> and
<a href="../lib/bignum.html">the bignum manpage</a> as in <a href="../lib/Pod/perlfunc.html#item_sqrt"><code>perl -Mbignum -le 'print sqrt(2)'</code></a>.</p>
<p><a href="../lib/Math/BigInt.html">the Math::BigInt manpage</a>, <a href="../lib/Math/BigRat.html">the Math::BigRat manpage</a> and <a href="../Math/Big.html">the Math::Big manpage</a> as well
as <a href="../Math/BigInt/BitVect.html">the Math::BigInt::BitVect manpage</a>, <a href="../Math/BigInt/Pari.html">the Math::BigInt::Pari manpage</a> and  <a href="../Math/BigInt/GMP.html">the Math::BigInt::GMP manpage</a>.</p>
<p>
</p>
<hr />
<h1><a name="authors">AUTHORS</a></h1>
<p>(C) by Tels <a href="http://bloodgate.com/">http://bloodgate.com/</a> in early 2002 - 2005.</p>

</body>

</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?