⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bigfloat.html

📁 perl教程
💻 HTML
📖 第 1 页 / 共 5 页
字号:
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bfac</span><span class="operator">();</span>                   <span class="comment"># factorial of $x (1*2*3*4*..$x)</span>
   
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bround</span><span class="operator">(</span><span class="variable">$N</span><span class="operator">);</span>               <span class="comment"># accuracy: preserve $N digits</span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bfround</span><span class="operator">(</span><span class="variable">$N</span><span class="operator">);</span>              <span class="comment"># precision: round to the $Nth digit</span>
</pre>
<pre>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bfloor</span><span class="operator">();</span>                 <span class="comment"># return integer less or equal than $x</span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bceil</span><span class="operator">();</span>                  <span class="comment"># return integer greater or equal than $x</span>
</pre>
<pre>
  <span class="comment"># The following do not modify their arguments:</span>
</pre>
<pre>
  <span class="variable">bgcd</span><span class="operator">(</span><span class="variable">@values</span><span class="operator">);</span>                <span class="comment"># greatest common divisor</span>
  <span class="variable">blcm</span><span class="operator">(</span><span class="variable">@values</span><span class="operator">);</span>                <span class="comment"># lowest common multiplicator</span>
  
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bstr</span><span class="operator">();</span>                   <span class="comment"># return string</span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bsstr</span><span class="operator">();</span>                  <span class="comment"># return string in scientific notation</span>
</pre>
<pre>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">as_int</span><span class="operator">();</span>                 <span class="comment"># return $x as BigInt </span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">exponent</span><span class="operator">();</span>               <span class="comment"># return exponent as BigInt</span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">mantissa</span><span class="operator">();</span>               <span class="comment"># return mantissa as BigInt</span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">parts</span><span class="operator">();</span>                  <span class="comment"># return (mantissa,exponent) as BigInt</span>
</pre>
<pre>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="keyword">length</span><span class="operator">();</span>                 <span class="comment"># number of digits (w/o sign and '.')</span>
  <span class="operator">(</span><span class="variable">$l</span><span class="operator">,</span><span class="variable">$f</span><span class="operator">)</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="keyword">length</span><span class="operator">();</span>       <span class="comment"># number of digits, and length of fraction</span>
</pre>
<pre>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">();</span>              <span class="comment"># return P of $x (or global, if P of $x undef)</span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">(</span><span class="variable">$n</span><span class="operator">);</span>            <span class="comment"># set P of $x to $n</span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">();</span>               <span class="comment"># return A of $x (or global, if A of $x undef)</span>
  <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">(</span><span class="variable">$n</span><span class="operator">);</span>             <span class="comment"># set A $x to $n</span>
</pre>
<pre>
  <span class="comment"># these get/set the appropriate global value for all BigFloat objects</span>
  <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">();</span>  <span class="comment"># Precision</span>
  <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">();</span>   <span class="comment"># Accuracy</span>
  <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">round_mode</span><span class="operator">();</span> <span class="comment"># rounding mode</span>
</pre>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>All operators (inlcuding basic math operations) are overloaded if you
declare your big floating point numbers as</p>
<pre>
  <span class="variable">$i</span> <span class="operator">=</span> <span class="variable">new</span> <span class="variable">Math::BigFloat</span> <span class="string">'12_3.456_789_123_456_789E-2'</span><span class="operator">;</span>
</pre>
<p>Operations with overloaded operators preserve the arguments, which is
exactly what you expect.</p>
<p>
</p>
<h2><a name="canonical_notation">Canonical notation</a></h2>
<p>Input to these routines are either BigFloat objects, or strings of the
following four forms:</p>
<ul>
<li>
<p><code>/^[+-]\d+$/</code></p>
</li>
<li>
<p><code>/^[+-]\d+\.\d*$/</code></p>
</li>
<li>
<p><code>/^[+-]\d+E[+-]?\d+$/</code></p>
</li>
<li>
<p><code>/^[+-]\d*\.\d+E[+-]?\d+$/</code></p>
</li>
</ul>
<p>all with optional leading and trailing zeros and/or spaces. Additonally,
numbers are allowed to have an underscore between any two digits.</p>
<p>Empty strings as well as other illegal numbers results in 'NaN'.</p>
<p><code>bnorm()</code> on a BigFloat object is now effectively a no-op, since the numbers 
are always stored in normalized form. On a string, it creates a BigFloat 
object.</p>
<p>
</p>
<h2><a name="output">Output</a></h2>
<p>Output values are BigFloat objects (normalized), except for <a href="#item_bstr"><code>bstr()</code></a> and bsstr().</p>
<p>The string output will always have leading and trailing zeros stripped and drop
a plus sign. <a href="#item_bstr"><code>bstr()</code></a> will give you always the form with a decimal point,
while <code>bsstr()</code> (s for scientific) gives you the scientific notation.</p>
<pre>
        Input                   bstr()          bsstr()
        '-0'                    '0'             '0E1'
        '  -123 123 123'        '-123123123'    '-123123123E0'
        '00.0123'               '0.0123'        '123E-4'
        '123.45E-2'             '1.2345'        '12345E-4'
        '10E+3'                 '10000'         '1E4'</pre>
<p>Some routines (<code>is_odd()</code>, <code>is_even()</code>, <code>is_zero()</code>, <code>is_one()</code>,
<code>is_nan()</code>) return true or false, while others (<code>bcmp()</code>, <code>bacmp()</code>)
return either undef, &lt;0, 0 or &gt;0 and are suited for sort.</p>
<p>Actual math is done by using the class defined with <code>with =</code> Class;&gt; (which
defaults to BigInts) to represent the mantissa and exponent.</p>
<p>The sign <code>/^[+-]$/</code> is stored separately. The string 'NaN' is used to 
represent the result when input arguments are not numbers, as well as 
the result of dividing by zero.</p>
<p>
</p>
<h2><a name="mantissa____exponent___and_parts__"><code>mantissa()</code>, <code>exponent()</code> and <code>parts()</code></a></h2>
<p><code>mantissa()</code> and <code>exponent()</code> return the said parts of the BigFloat 
as BigInts such that:</p>
<pre>
        <span class="variable">$m</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">mantissa</span><span class="operator">();</span>
        <span class="variable">$e</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">exponent</span><span class="operator">();</span>
        <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$m</span> <span class="operator">*</span> <span class="operator">(</span> <span class="number">10</span> <span class="operator">**</span> <span class="variable">$e</span> <span class="operator">);</span>
        <span class="keyword">print</span> <span class="string">"ok\n"</span> <span class="keyword">if</span> <span class="variable">$x</span> <span class="operator">==</span> <span class="variable">$y</span><span class="operator">;</span>
</pre>
<p><code>($m,$e) = $x-&gt;parts();</code> is just a shortcut giving you both of them.</p>
<p>A zero is represented and returned as <code>0E1</code>, <strong>not</strong> <code>0E0</code> (after Knuth).</p>
<p>Currently the mantissa is reduced as much as possible, favouring higher
exponents over lower ones (e.g. returning 1e7 instead of 10e6 or 10000000e0).
This might change in the future, so do not depend on it.</p>
<p>
</p>
<h2><a name="accuracy_vs__precision">Accuracy vs. Precision</a></h2>
<p>See also: <em>Rounding</em>.</p>
<p>Math::BigFloat supports both precision (rounding to a certain place before or
after the dot) and accuracy (rounding to a certain number of digits). For a
full documentation, examples and tips on these topics please see the large
section about rounding in <a href="../../lib/Math/BigInt.html">the Math::BigInt manpage</a>.</p>
<p>Since things like <a href="../../lib/Pod/perlfunc.html#item_sqrt"><code>sqrt(2)</code></a> or <code>1 / 3</code> must presented with a limited
accuracy lest a operation consumes all resources, each operation produces
no more than the requested number of digits.</p>
<p>If there is no gloabl precision or accuracy set, <strong>and</strong> the operation in
question was not called with a requested precision or accuracy, <strong>and</strong> the
input $x has no accuracy or precision set, then a fallback parameter will
be used. For historical reasons, it is called <code>div_scale</code> and can be accessed
via:</p>
<pre>
        <span class="variable">$d</span> <span class="operator">=</span> <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">div_scale</span><span class="operator">();</span>               <span class="comment"># query</span>
        <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">div_scale</span><span class="operator">(</span><span class="variable">$n</span><span class="operator">);</span>                  <span class="comment"># set to $n digits</span>
</pre>
<p>The default value for <code>div_scale</code> is 40.</p>
<p>In case the result of one operation has more digits than specified,
it is rounded. The rounding mode taken is either the default mode, or the one
supplied to the operation after the <em>scale</em>:</p>
<pre>
        <span class="variable">$x</span> <span class="operator">=</span> <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">new</span><span class="operator">(</span><span class="number">2</span><span class="operator">);</span>
        <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">(</span><span class="number">5</span><span class="operator">);</span>            <span class="comment"># 5 digits max</span>
        <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">copy</span><span class="operator">()-&gt;</span><span class="variable">bdiv</span><span class="operator">(</span><span class="number">3</span><span class="operator">);</span>               <span class="comment"># will give 0.66667</span>
        <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">copy</span><span class="operator">()-&gt;</span><span class="variable">bdiv</span><span class="operator">(</span><span class="number">3</span><span class="operator">,</span><span class="number">6</span><span class="operator">);</span>             <span class="comment"># will give 0.666667</span>

⌨️ 快捷键说明

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