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

📄 bigfloat.html

📁 perl教程
💻 HTML
📖 第 1 页 / 共 5 页
字号:
        <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="keyword">undef</span><span class="operator">,</span><span class="string">'odd'</span><span class="operator">);</span> <span class="comment"># will give 0.666667</span>
        <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">round_mode</span><span class="operator">(</span><span class="string">'zero'</span><span class="operator">);</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 also give 0.666667</span>
</pre>
<p>Note that <code>Math::BigFloat-&gt;accuracy()</code> and <a href="#item_precision"><code>Math::BigFloat-&gt;precision()</code></a>
set the global variables, and thus <strong>any</strong> newly created number will be subject
to the global rounding <strong>immidiately</strong>. This means that in the examples above, the
<code>3</code> as argument to <a href="#item_bdiv"><code>bdiv()</code></a> will also get an accuracy of <strong>5</strong>.</p>
<p>It is less confusing to either calculate the result fully, and afterwards
round it explicitely, or use the additional parameters to the math
functions like so:</p>
<pre>
        <span class="keyword">use</span> <span class="variable">Math::BigFloat</span><span class="operator">;</span>     
        <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">$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="keyword">print</span> <span class="variable">$y</span><span class="operator">-&gt;</span><span class="variable">bround</span><span class="operator">(</span><span class="number">5</span><span class="operator">),</span><span class="string">"\n"</span><span class="operator">;</span>               <span class="comment"># will give 0.66667</span>
</pre>
<pre>
        or</pre>
<pre>
        <span class="keyword">use</span> <span class="variable">Math::BigFloat</span><span class="operator">;</span>     
        <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">$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">5</span><span class="operator">);</span>             <span class="comment"># will give 0.66667</span>
        <span class="keyword">print</span> <span class="string">"$y\n"</span><span class="operator">;</span>
</pre>
<p>
</p>
<h2><a name="rounding">Rounding</a></h2>
<dl>
<dt><strong><a name="item_ffround">ffround ( +$scale )</a></strong>

<dd>
<p>Rounds to the $scale'th place left from the '.', counting from the dot.
The first digit is numbered 1.</p>
</dd>
</li>
<dt><strong>ffround ( -$scale )</strong>

<dd>
<p>Rounds to the $scale'th place right from the '.', counting from the dot.</p>
</dd>
</li>
<dt><strong>ffround ( 0 )</strong>

<dd>
<p>Rounds to an integer.</p>
</dd>
</li>
<dt><strong><a name="item_fround">fround  ( +$scale )</a></strong>

<dd>
<p>Preserves accuracy to $scale digits from the left (aka significant digits)
and pads the rest with zeros. If the number is between 1 and -1, the
significant digits count from the first non-zero after the '.'</p>
</dd>
</li>
<dt><strong>fround  ( -$scale ) and fround ( 0 )</strong>

<dd>
<p>These are effectively no-ops.</p>
</dd>
</li>
</dl>
<p>All rounding functions take as a second parameter a rounding mode from one of
the following: 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'.</p>
<p>The default rounding mode is 'even'. By using
<code>Math::BigFloat-&gt;round_mode($round_mode);</code> you can get and set the default
mode for subsequent rounding. The usage of <code>$Math::BigFloat::$round_mode</code> is
no longer supported.
The second parameter to the round functions then overrides the default
temporarily.</p>
<p>The <code>as_number()</code> function returns a BigInt from a Math::BigFloat. It uses
'trunc' as rounding mode to make it equivalent to:</p>
<pre>
        <span class="variable">$x</span> <span class="operator">=</span> <span class="number">2.5</span><span class="operator">;</span>
        <span class="variable">$y</span> <span class="operator">=</span> <span class="keyword">int</span><span class="operator">(</span><span class="variable">$x</span><span class="operator">)</span> <span class="operator">+</span> <span class="number">2</span><span class="operator">;</span>
</pre>
<p>You can override this by passing the desired rounding mode as parameter to
<code>as_number()</code>:</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.5</span><span class="operator">);</span>
        <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">as_number</span><span class="operator">(</span><span class="string">'odd'</span><span class="operator">);</span>      <span class="comment"># $y = 3</span>
</pre>
<p>
</p>
<hr />
<h1><a name="methods">METHODS</a></h1>
<p>
</p>
<h2><a name="accuracy">accuracy</a></h2>
<pre>
        <span class="variable">$x</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"># local for $x</span>
        <span class="variable">CLASS</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"># global for all members of CLASS</span>
                                        <span class="comment"># Note: This also applies to new()!</span>
</pre>
<pre>
        <span class="variable">$A</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">();</span>            <span class="comment"># read out accuracy that affects $x</span>
        <span class="variable">$A</span> <span class="operator">=</span> <span class="variable">CLASS</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">();</span>         <span class="comment"># read out global accuracy</span>
</pre>
<p>Set or get the global or local accuracy, aka how many significant digits the
results have. If you set a global accuracy, then this also applies to new()!</p>
<p>Warning! The accuracy <em>sticks</em>, e.g. once you created a number under the
influence of <code>CLASS-&gt;accuracy($A)</code>, all results from math operations with
that number will also be rounded.</p>
<p>In most cases, you should probably round the results explicitely using one of
<em>round()</em>, <em>bround()</em> or <em>bfround()</em> or by passing the desired accuracy
to the math operation as additional parameter:</p>
<pre>
        <span class="keyword">my</span> <span class="variable">$x</span> <span class="operator">=</span> <span class="variable">Math::BigInt</span><span class="operator">-&gt;</span><span class="variable">new</span><span class="operator">(</span><span class="number">30000</span><span class="operator">);</span>
        <span class="keyword">my</span> <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">Math::BigInt</span><span class="operator">-&gt;</span><span class="variable">new</span><span class="operator">(</span><span class="number">7</span><span class="operator">);</span>
        <span class="keyword">print</span> <span class="keyword">scalar</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="variable">$y</span><span class="operator">,</span> <span class="number">2</span><span class="operator">);</span>           <span class="comment"># print 4300</span>
        <span class="keyword">print</span> <span class="keyword">scalar</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="variable">$y</span><span class="operator">)-&gt;</span><span class="variable">bround</span><span class="operator">(</span><span class="number">2</span><span class="operator">);</span>   <span class="comment"># print 4300</span>
</pre>
<p>
</p>
<h2><a name="precision__"><a href="#item_precision"><code>precision()</code></a></a></h2>
<pre>
        <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">(-</span><span class="number">2</span><span class="operator">);</span>      <span class="comment"># local for $x, round at the second digit right of the dot</span>
        <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">(</span><span class="number">2</span><span class="operator">);</span>       <span class="comment"># ditto, round at the second digit left of the dot</span>
</pre>
<pre>
        <span class="variable">CLASS</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">(</span><span class="number">5</span><span class="operator">);</span>    <span class="comment"># Global for all members of CLASS</span>
                                <span class="comment"># This also applies to new()!</span>
        <span class="variable">CLASS</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">(-</span><span class="number">5</span><span class="operator">);</span>   <span class="comment"># ditto</span>
</pre>
<pre>
        <span class="variable">$P</span> <span class="operator">=</span> <span class="variable">CLASS</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">();</span>        <span class="comment"># read out global precision</span>
        <span class="variable">$P</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">();</span>           <span class="comment"># read out precision that affects $x</span>
</pre>
<p>Note: You probably want to use <em>accuracy()</em> instead. With <a href="#accuracy">the accuracy manpage</a> you
set the number of digits each result should have, with <a href="#item_precision">precision</a> you
set the place where to round!</p>
<p>
</p>
<hr />
<h1><a name="autocreating_constants">Autocreating constants</a></h1>
<p>After <code>use Math::BigFloat ':constant'</code> all the floating point constants
in the given scope are converted to <code>Math::BigFloat</code>. This conversion
happens at compile time.</p>
<p>In particular</p>
<pre>
  perl -MMath::BigFloat=:constant -e 'print 2E-100,&quot;\n&quot;'</pre>
<p>prints the value of <code>2E-100</code>. Note that without conversion of 
constants the expression 2E-100 will be calculated as normal floating point 

⌨️ 快捷键说明

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