uTools-Manuals/docs/python/fpectl.html
2019-04-21 11:50:48 +08:00

21 lines
9.6 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-fpectl"><h1><span class="yiyi-st" id="yiyi-10">29.14. <a class="reference internal" href="#module-fpectl" title="fpectl: Provide control for floating point exception handling. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">fpectl</span></code></a> - 浮点异常控制</span></h1><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-11">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-fpectl" title="fpectl: Provide control for floating point exception handling. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">fpectl</span></code></a>模块不是默认构建的,它的使用是不鼓励的,可能是危险的,除非在专家的手中。</span><span class="yiyi-st" id="yiyi-13">有关更多详细信息,另见有关限制的<a class="reference internal" href="#fpectl-limitations"><span>Limitations and other considerations</span></a>部分。</span></p></div><p><span class="yiyi-st" id="yiyi-14">大多数计算机执行符合所谓的IEEE-754标准的浮点运算。</span><span class="yiyi-st" id="yiyi-15">在任何实际计算机上,一些浮点运算产生的结果不能表示为正常浮点值。</span><span class="yiyi-st" id="yiyi-16">例如,尝试</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">math</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">math</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
<span class="go">inf</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">math</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> <span class="o">/</span> <span class="n">math</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
<span class="go">nan</span>
</code></pre><p><span class="yiyi-st" id="yiyi-17">(上面的例子将在许多平台上工作。</span><span class="yiyi-st" id="yiyi-18">DEC Alpha可能是一个例外。</span><span class="yiyi-st" id="yiyi-19">“Inf”是IEEE-754中表示“无穷大”的特殊非数字值“nan”表示“不是数字”。请注意除非非数字结果 Python来执行这些计算。</span><span class="yiyi-st" id="yiyi-20">这实际上是IEEE-754标准中规定的默认行为如果它适用于你现在就停止读。</span></p><p><span class="yiyi-st" id="yiyi-21">在某些情况下,最好引入异常并在尝试有故障的操作时停止处理。</span><span class="yiyi-st" id="yiyi-22"><a class="reference internal" href="#module-fpectl" title="fpectl: Provide control for floating point exception handling. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">fpectl</span></code></a>模块适用于这种情况。</span><span class="yiyi-st" id="yiyi-23">它提供对来自几个硬件制造商的浮点单元的控制允许用户在发生任何IEEE-754异常除零溢出或无效操作时打开<code class="xref py py-const docutils literal"><span class="pre">SIGFPE</span></code>的生成。</span><span class="yiyi-st" id="yiyi-24">与插入到包含您的python系统的C代码中的一对包装宏一起<code class="xref py py-const docutils literal"><span class="pre">SIGFPE</span></code>被捕获并转换为Python <a class="reference internal" href="exceptions.html#FloatingPointError" title="FloatingPointError"><code class="xref py py-exc docutils literal"><span class="pre">FloatingPointError</span></code></a>异常。</span></p><p><span class="yiyi-st" id="yiyi-25"><a class="reference internal" href="#module-fpectl" title="fpectl: Provide control for floating point exception handling. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">fpectl</span></code></a>模块定义以下函数,并可能引发给定异常:</span></p><dl class="function"><dt id="fpectl.turnon_sigfpe"><span class="yiyi-st" id="yiyi-26"> <code class="descclassname">fpectl.</code><code class="descname">turnon_sigfpe</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-27">打开<code class="xref py py-const docutils literal"><span class="pre">SIGFPE</span></code>的生成,并设置适当的信号处理程序。</span></p></dd></dl><dl class="function"><dt id="fpectl.turnoff_sigfpe"><span class="yiyi-st" id="yiyi-28"> <code class="descclassname">fpectl.</code><code class="descname">turnoff_sigfpe</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-29">重置缺省处理浮点异常。</span></p></dd></dl><dl class="exception"><dt id="fpectl.FloatingPointError"><span class="yiyi-st" id="yiyi-30"> <em class="property">exception </em><code class="descclassname">fpectl.</code><code class="descname">FloatingPointError</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-31">在执行<a class="reference internal" href="#fpectl.turnon_sigfpe" title="fpectl.turnon_sigfpe"><code class="xref py py-func docutils literal"><span class="pre">turnon_sigfpe()</span></code></a>之后引发IEEE-754异常除以零溢出或无效操作的浮点操作将反过来引发此标准Python异常。</span></p></dd></dl><div class="section" id="example"><h2><span class="yiyi-st" id="yiyi-32">29.14.1. </span><span class="yiyi-st" id="yiyi-33">示例</span></h2><p><span class="yiyi-st" id="yiyi-34">以下示例演示如何启动和测试<a class="reference internal" href="#module-fpectl" title="fpectl: Provide control for floating point exception handling. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">fpectl</span></code></a>模块的操作。</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">fpectl</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">fpetest</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">fpectl</span><span class="o">.</span><span class="n">turnon_sigfpe</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">fpetest</span><span class="o">.</span><span class="n">test</span><span class="p">()</span>
<span class="go">overflow PASS</span>
<span class="go">FloatingPointError: Overflow</span>
<span class="go">div by 0 PASS</span>
<span class="go">FloatingPointError: Division by zero</span>
<span class="go"> [ more output from test elided ]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">math</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">math</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"&lt;stdin&gt;"</span>, line <span class="m">1</span>, in <span class="n">?</span>
<span class="gr">FloatingPointError</span>: <span class="n">in math_1</span>
</code></pre></div><div class="section" id="limitations-and-other-considerations"><h2><span class="yiyi-st" id="yiyi-35">29.14.2. </span><span class="yiyi-st" id="yiyi-36">限制和其他考虑</span></h2><p><span class="yiyi-st" id="yiyi-37">设置给定处理器以捕获IEEE-754浮点错误当前需要基于每架构的自定义代码。</span><span class="yiyi-st" id="yiyi-38">您可能需要修改<a class="reference internal" href="#module-fpectl" title="fpectl: Provide control for floating point exception handling. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">fpectl</span></code></a>才能控制您的特定硬件。</span></p><p><span class="yiyi-st" id="yiyi-39">将IEEE-754异常转换为Python异常需要以适当的方式将包装器宏<code class="docutils literal"><span class="pre">PyFPE_START_PROTECT</span></code><code class="docutils literal"><span class="pre">PyFPE_END_PROTECT</span></code>插入到代码中。</span><span class="yiyi-st" id="yiyi-40">Python本身已经被修改以支持<a class="reference internal" href="#module-fpectl" title="fpectl: Provide control for floating point exception handling. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">fpectl</span></code></a>模块,但是数值分析师感兴趣的许多其他代码没有。</span></p><p><span class="yiyi-st" id="yiyi-41"><a class="reference internal" href="#module-fpectl" title="fpectl: Provide control for floating point exception handling. (Unix)"><code class="xref py py-mod docutils literal"><span class="pre">fpectl</span></code></a>模块不是线程安全的。</span></p><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-42">也可以看看</span></p><p class="last"><span class="yiyi-st" id="yiyi-43">源分发中的一些文件可能有兴趣更多地了解此模块如何操作。</span><span class="yiyi-st" id="yiyi-44">include文件<code class="file docutils literal"><span class="pre">Include/pyfpe.h</span></code>讨论了此模块的实现过程。</span><span class="yiyi-st" id="yiyi-45"><code class="file docutils literal"><span class="pre">Modules/fpetestmodule.c</span></code>提供了几个使用示例。</span><span class="yiyi-st" id="yiyi-46">许多其他示例可以在<code class="file docutils literal"><span class="pre">Objects/floatobject.c</span></code>中找到。</span></p></div></div></div></div>