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

📄 bigfloat.html

📁 perl教程
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<h1><a name="caveats">CAVEATS</a></h1>
<dl>
<dt><strong><a name="item_bstr">stringify, <code>bstr()</code></a></strong>

<dd>
<p>Both stringify and <a href="#item_bstr"><code>bstr()</code></a> now drop the leading '+'. The old code would return
'+1.23', the new returns '1.23'. See the documentation in <a href="../../lib/Math/BigInt.html">the Math::BigInt manpage</a> for
reasoning and details.</p>
</dd>
</li>
<dt><strong><a name="item_bdiv">bdiv</a></strong>

<dd>
<p>The following will probably not do what you expect:</p>
</dd>
<dd>
<pre>
        <span class="keyword">print</span> <span class="variable">$c</span><span class="operator">-&gt;</span><span class="variable">bdiv</span><span class="operator">(</span><span class="number">123.456</span><span class="operator">),</span><span class="string">"\n"</span><span class="operator">;</span>
</pre>
</dd>
<dd>
<p>It prints both quotient and reminder since print works in list context. Also,
<a href="#item_bdiv"><code>bdiv()</code></a> will modify $c, so be carefull. You probably want to use</p>
</dd>
<dd>
<pre>

        <span class="keyword">print</span> <span class="variable">$c</span> <span class="operator">/</span> <span class="number">123.456</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>
        <span class="keyword">print</span> <span class="keyword">scalar</span> <span class="variable">$c</span><span class="operator">-&gt;</span><span class="variable">bdiv</span><span class="operator">(</span><span class="number">123.456</span><span class="operator">),</span><span class="string">"\n"</span><span class="operator">;</span>  <span class="comment"># or if you want to modify $c</span>
</pre>
</dd>
<dd>
<p>instead.</p>
</dd>
</li>
<dt><strong><a name="item_modifying_and__3d">Modifying and =</a></strong>

<dd>
<p>Beware of:</p>
</dd>
<dd>
<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">5</span><span class="operator">);</span>
        <span class="variable">$y</span> <span class="operator">=</span> <span class="variable">$x</span><span class="operator">;</span>
</pre>
</dd>
<dd>
<p>It will not do what you think, e.g. making a copy of $x. Instead it just makes
a second reference to the <strong>same</strong> object and stores it in $y. Thus anything
that modifies $x will modify $y (except overloaded math operators), and vice
versa. See <a href="../../lib/Math/BigInt.html">the Math::BigInt manpage</a> for details and how to avoid that.</p>
</dd>
</li>
<dt><strong><a name="item_bpow">bpow</a></strong>

<dd>
<p><a href="#item_bpow"><code>bpow()</code></a> now modifies the first argument, unlike the old code which left
it alone and only returned the result. This is to be consistent with
<code>badd()</code> etc. The first will modify $x, the second one won't:</p>
</dd>
<dd>
<pre>
        <span class="keyword">print</span> <span class="variable">bpow</span><span class="operator">(</span><span class="variable">$x</span><span class="operator">,</span><span class="variable">$i</span><span class="operator">),</span><span class="string">"\n"</span><span class="operator">;</span>         <span class="comment"># modify $x</span>
        <span class="keyword">print</span> <span class="variable">$x</span><span class="operator">-&gt;</span><span class="variable">bpow</span><span class="operator">(</span><span class="variable">$i</span><span class="operator">),</span><span class="string">"\n"</span><span class="operator">;</span>        <span class="comment"># ditto</span>
        <span class="keyword">print</span> <span class="variable">$x</span> <span class="operator">**</span> <span class="variable">$i</span><span class="operator">,</span><span class="string">"\n"</span><span class="operator">;</span>            <span class="comment"># leave $x alone</span>
</pre>
</dd>
</li>
<dt><strong><a name="item_precision"><code>precision()</code> vs. <code>accuracy()</code></a></strong>

<dd>
<p>A common pitfall is to use <a href="#item_precision">precision()</a> when you want to round a result to
a certain number of digits:</p>
</dd>
<dd>
<pre>
        <span class="keyword">use</span> <span class="variable">Math::BigFloat</span><span class="operator">;</span>
</pre>
</dd>
<dd>
<pre>
        <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">(</span><span class="number">4</span><span class="operator">);</span>           <span class="comment"># does not do what you think it does</span>
        <span class="keyword">my</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">12345</span><span class="operator">);</span>     <span class="comment"># rounds $x to "12000"!</span>
        <span class="keyword">print</span> <span class="string">"$x\n"</span><span class="operator">;</span>                           <span class="comment"># print "12000"</span>
        <span class="keyword">my</span> <span class="variable">$y</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">3</span><span class="operator">);</span>         <span class="comment"># rounds $y to "0"!</span>
        <span class="keyword">print</span> <span class="string">"$y\n"</span><span class="operator">;</span>                           <span class="comment"># print "0"</span>
        <span class="variable">$z</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="comment"># 12000 / 0 =&gt; NaN!</span>
        <span class="keyword">print</span> <span class="string">"$z\n"</span><span class="operator">;</span>
        <span class="keyword">print</span> <span class="variable">$z</span><span class="operator">-&gt;</span><span class="variable">precision</span><span class="operator">(),</span><span class="string">"\n"</span><span class="operator">;</span>             <span class="comment"># 4</span>
</pre>
</dd>
<dd>
<p>Replacing <a href="#item_precision">precision</a> with <a href="#accuracy">the accuracy manpage</a> is probably not what you want, either:</p>
</dd>
<dd>
<pre>
        <span class="keyword">use</span> <span class="variable">Math::BigFloat</span><span class="operator">;</span>
</pre>
</dd>
<dd>
<pre>
        <span class="variable">Math::BigFloat</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">(</span><span class="number">4</span><span class="operator">);</span>            <span class="comment"># enables global rounding:</span>
        <span class="keyword">my</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">123456</span><span class="operator">);</span>    <span class="comment"># rounded immidiately to "12350"</span>
        <span class="keyword">print</span> <span class="string">"$x\n"</span><span class="operator">;</span>                           <span class="comment"># print "123500"</span>
        <span class="keyword">my</span> <span class="variable">$y</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">3</span><span class="operator">);</span>         <span class="comment"># rounded to "3</span>
        <span class="keyword">print</span> <span class="string">"$y\n"</span><span class="operator">;</span>                           <span class="comment"># print "3"</span>
        <span class="keyword">print</span> <span class="variable">$z</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="variable">$y</span><span class="operator">),</span><span class="string">"\n"</span><span class="operator">;</span>   <span class="comment"># 41170</span>
        <span class="keyword">print</span> <span class="variable">$z</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">(),</span><span class="string">"\n"</span><span class="operator">;</span>              <span class="comment"># 4</span>
</pre>
</dd>
<dd>
<p>What you want to use instead is:</p>
</dd>
<dd>
<pre>
        <span class="keyword">use</span> <span class="variable">Math::BigFloat</span><span class="operator">;</span>
</pre>
</dd>
<dd>
<pre>
        <span class="keyword">my</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">123456</span><span class="operator">);</span>    <span class="comment"># no rounding</span>
        <span class="keyword">print</span> <span class="string">"$x\n"</span><span class="operator">;</span>                           <span class="comment"># print "123456"</span>
        <span class="keyword">my</span> <span class="variable">$y</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">3</span><span class="operator">);</span>         <span class="comment"># no rounding</span>
        <span class="keyword">print</span> <span class="string">"$y\n"</span><span class="operator">;</span>                           <span class="comment"># print "3"</span>
        <span class="keyword">print</span> <span class="variable">$z</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="variable">$y</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"># 41150</span>
        <span class="keyword">print</span> <span class="variable">$z</span><span class="operator">-&gt;</span><span class="variable">accuracy</span><span class="operator">(),</span><span class="string">"\n"</span><span class="operator">;</span>              <span class="comment"># undef</span>
</pre>
</dd>
<dd>
<p>In addition to computing what you expected, the last example also does <strong>not</strong>
&quot;taint&quot; the result with an accuracy or precision setting, which would
influence any further operation.</p>
</dd>
</li>
</dl>
<p>
</p>
<hr />
<h1><a name="see_also">SEE ALSO</a></h1>
<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>The pragmas <a href="../../lib/bignum.html">the bignum manpage</a>, <a href="../../lib/bigint.html">the bigint manpage</a> and <a href="../../lib/bigrat.html">the bigrat manpage</a> might also be of interest
because they solve the autoupgrading/downgrading is

⌨️ 快捷键说明

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