mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
21 lines
9.6 KiB
HTML
21 lines
9.6 KiB
HTML
<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">>>> </span><span class="kn">import</span> <span class="nn">math</span>
|
||
<span class="gp">>>> </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">>>> </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">>>> </span><span class="kn">import</span> <span class="nn">fpectl</span>
|
||
<span class="gp">>>> </span><span class="kn">import</span> <span class="nn">fpetest</span>
|
||
<span class="gp">>>> </span><span class="n">fpectl</span><span class="o">.</span><span class="n">turnon_sigfpe</span><span class="p">()</span>
|
||
<span class="gp">>>> </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">>>> </span><span class="kn">import</span> <span class="nn">math</span>
|
||
<span class="gp">>>> </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">"<stdin>"</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> |