📄 bigrat.html
字号:
<?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>bigrat - Transparent BigNumber/BigRational 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>bigrat - Transparent BigNumber/BigRational 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="#modules_used">Modules Used</a></li>
<li><a href="#math_library">Math Library</a></li>
<li><a href="#sign">Sign</a></li>
<li><a href="#methods">Methods</a></li>
<li><a href="#cavaet">Cavaet</a></li>
<li><a href="#options">Options</a></li>
</ul>
<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>bigrat - Transparent BigNumber/BigRational support for Perl</p>
<p>
</p>
<hr />
<h1><a name="synopsis">SYNOPSIS</a></h1>
<pre>
<span class="keyword">use</span> <span class="variable">bigrat</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"># BigFloat 6.5</span>
<span class="keyword">print</span> <span class="number">1</span><span class="operator">/</span><span class="number">3</span> <span class="operator">+</span> <span class="number">1</span><span class="operator">/</span><span class="number">4</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span> <span class="comment"># produces 7/12</span>
</pre>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>All operators (inlcuding basic math operations) are overloaded. Integer and
floating-point constants are created as proper BigInts or BigFloats,
respectively.</p>
<p>Other than <a href="../lib/bignum.html">the bignum manpage</a>, this module upgrades to Math::BigRat, meaning that
instead of 2.5 you will get 2+1/2 as output.</p>
<p>
</p>
<h2><a name="modules_used">Modules Used</a></h2>
<p><code>bigrat</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 bignum:</p>
<pre>
Math::BigInt::Lite (for speed, and only if it is loadable)
Math::BigInt
Math::BigFloat
Math::BigRat</pre>
<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">bigrat</span> <span class="string">lib</span> <span class="operator">=></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">bigrat</span> <span class="string">lib</span> <span class="operator">=></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">bigrat</span> <span class="string">lib</span> <span class="operator">=></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="sign">Sign</a></h2>
<p>The sign is either '+', '-', 'NaN', '+inf' or '-inf'.</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 not objects, you can use all functions that are part of
the BigInt or BigFloat API. It is wise to use only the <code>bxxx()</code> notation, and not
the <code>fxxx()</code> notation, though. This makes you independed on the fact that the
underlying object might morph into a different class than BigFloat.</p>
<p>
</p>
<h2><a name="cavaet">Cavaet</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>If you want to make a real copy, use the following:</p>
<pre>
<span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-></span><span class="variable">copy</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">-></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">-></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">-></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>
<p>Using methods that do not modify, but testthe contents works:</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">$z</span> <span class="operator">=</span> <span class="number">9</span> <span class="keyword">if</span> <span class="variable">$x</span><span class="operator">-></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>
<h2><a name="options">Options</a></h2>
<p>bignum 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 -Mbigrat=a,50 -le 'print sqrt(20)'</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, while
a positive value rounds to this digit left from the dot. 0 or 1 mean round to
integer. See Math::BigInt's <code>bfround()</code> function for details.</p>
</dd>
<dd>
<pre>
perl -Mbigrat=p,-50 -le 'print sqrt(20)'</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 bignum or
Math::BigInt/Math::BigFloat.</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 -Mbigrat=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 -Mbigrat=v</pre>
</dd>
</li>
</dl>
<p>
</p>
<hr />
<h1><a name="examples">EXAMPLES</a></h1>
<pre>
<span class="variable">perl</span> <span class="operator">-</span><span class="variable">Mbigrat</span> <span class="operator">-</span><span class="keyword">le</span> <span class="string">'print sqrt(33)'</span>
<span class="variable">perl</span> <span class="operator">-</span><span class="variable">Mbigrat</span> <span class="operator">-</span><span class="keyword">le</span> <span class="string">'print 2*255'</span>
<span class="variable">perl</span> <span class="operator">-</span><span class="variable">Mbigrat</span> <span class="operator">-</span><span class="keyword">le</span> <span class="string">'print 4.5+2*255'</span>
<span class="variable">perl</span> <span class="operator">-</span><span class="variable">Mbigrat</span> <span class="operator">-</span><span class="keyword">le</span> <span class="string">'print 3/7 + 5/7 + 8/3'</span>
<span class="variable">perl</span> <span class="operator">-</span><span class="variable">Mbigrat</span> <span class="operator">-</span><span class="keyword">le</span> <span class="string">'print 12->is_odd()'</span><span class="operator">;</span>
</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/bignum.html">the bignum manpage</a>.</p>
<p><a href="../lib/Math/BigFloat.html">the Math::BigFloat manpage</a>, <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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -