166 lines
11 KiB
HTML
166 lines
11 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>浮点环境</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_numeric_fenv skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">浮点环境</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-numeric.html">numeric</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>浮点环境是实现所支持的浮点状态标志集合及控制模式。它是线程局域的,每个线程从亲线程继承其浮点环境的初始状态。浮点运算修改浮点状态标志,以指示异常结果或辅助信息。浮点控制模式的状态影响一些浮点运算的产出。</p>
|
|
<p>浮点环境访问和修改仅在 <a href="cpp-preprocessor-impl.html"><tt>#pragma STDC FENV_ACCESS</tt></a> 得到支持并被设为 <code>ON</code> 时有意义。否则实现有假设浮点控制模式始终是默认者,且浮点状态标志决不被测试或被修改的自由。实践中,少数当前编译器,例如 HP aCC 、 Oracle Studio 或 IBM XL 显式支持 <code>#pragma</code> ,但无论如何,大多数编译器允许有意义地访问浮点环境。</p>
|
|
<h3><span class="mw-headline" id=".E7.B1.BB.E5.9E.8B">类型</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-cfenv.html"><cfenv></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">fenv_t</span></span></td>
|
|
<td>表示整个浮点环境的类型</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">fexcept_t</span></span></td>
|
|
<td>汇集地表示所有浮点状态标志的类型</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.87.BD.E6.95.B0">函数</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-feclearexcept.html"><span class="t-lines"><span>feclearexcept</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>清除指定的浮点状态标志<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-fetestexcept.html"><span class="t-lines"><span>fetestexcept</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>确定设置了哪个指定的浮点状态标志<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-feraiseexcept.html"><span class="t-lines"><span>feraiseexcept</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>引发指定的浮点异常<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-feexceptflag.html"><span class="t-lines"><span>fegetexceptflag</span><span>fesetexceptflag</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>从浮点环境(或向其中)复制指定的浮点状态标志<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-feround.html"><span class="t-lines"><span>fegetround</span><span>fesetround</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>获取或设置舍入方向<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-feenv.html"><span class="t-lines"><span>fegetenv</span><span>fesetenv</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>保存或恢复当前浮点环境<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-feholdexcept.html"><span class="t-lines"><span>feholdexcept</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>保存环境,清除所有状态标志,并忽略所有将来的错误<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-feupdateenv.html"><span class="t-lines"><span>feupdateenv</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>恢复浮点环境并引发之前引发的异常<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.AE.8F">宏</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-FE_exceptions.html"><span class="t-lines"><span>FE_ALL_EXCEPT</span><span>FE_DIVBYZERO</span><span>FE_INEXACT</span><span>FE_INVALID</span><span>FE_OVERFLOW</span><span>FE_UNDERFLOW</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>浮点异常<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-FE_round.html"><span class="t-lines"><span>FE_DOWNWARD</span><span>FE_TONEAREST</span><span>FE_TOWARDZERO</span><span>FE_UPWARD</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>浮点舍入方向<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-fenv-FE_DFL_ENV.html"><span class="t-lines"><span>FE_DFL_ENV</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>默认浮点环境<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E6.84.8F">注意</span></h3>
|
|
<p>浮点异常与 C++ 异常无关。浮点运算引发浮点异常时,浮点环境的状态改变,这能用 <span class="t-lc"><a href="cpp-numeric-fenv-fetestexcept.html">std::fetestexcept</a></span> 测试,但绝大多数实现上 C++ 程序执行持续而不中断。</p>
|
|
<p>有编译器扩展,可用于凡在引发浮点异常时自动生成 C++ 异常:</p>
|
|
<ul>
|
|
<li>GNU libc 函数 <code><a rel="nofollow" class="external text" href="http://www.gnu.org/s/hello/manual/libc/Control-Functions.html">feenableexcept()</a></code> 启用浮点异常的陷阱,它生成信号 <code>SIGFPE</code> 。若使用编译器选项 <code>-fnon-call-exceptions</code> ,则该信号的处理函数可抛出用户定义的 C++ 异常。</li>
|
|
<li>MSVC 函数 <code><a rel="nofollow" class="external text" href="http://msdn.microsoft.com/en-us/library/e9b52ceh.aspx">_control87()</a></code> 启用浮点异常的陷阱,它生成硬件异常,这能用 <code><a rel="nofollow" class="external text" href="http://msdn.microsoft.com/en-us/library/5z4bw5h5.aspx">_set_se_translator</a></code> 转换成 C++ 异常。</li>
|
|
</ul>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|