183 lines
15 KiB
HTML
183 lines
15 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>MATH_ERRNO, MATH_ERREXCEPT, math_errhandling</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_math_math_errhandling skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">MATH_ERRNO, MATH_ERREXCEPT, math_errhandling</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-numeric.html">numeric</a>‎ | <a href="cpp-numeric-math.html">math</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-cmath.html"><cmath></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="co2">#define MATH_ERRNO 1</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="co2">#define MATH_ERREXCEPT 2</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="co2">#define math_errhandling /*implementation defined*/</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>宏常量 <code>math_errhandling</code> 展开成 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> 类型的表达式,要么等于 <code>MATH_ERRNO</code> ,要么等于 <code>MATH_ERREXCEPT</code> ,要么等于其逐位或( <span class="t-c"><span class="mw-geshi cpp source-cpp">MATH_ERRNO <span class="sy3">|</span> MATH_ERREXCEPT</span></span> )。</p>
|
|
<p><code>math_errhandling</code> 的值指示浮点运算符和<a href="cpp-numeric-math.html">函数</a>所进行的错误处理:</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-hitem">
|
|
<td>常量</td>
|
|
<td>解释</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>MATH_ERREXCEPT</code></td>
|
|
<td>指示使用浮点异常: <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><</span>cfenv<span class="sy1">></span></span></span> 中至少定义了 <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_DIVBYZERO</a></span> 、 <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_INVALID</a></span> 及 <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_OVERFLOW</a></span> 。</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>MATH_ERRNO</code></td>
|
|
<td>指明浮点运算使用变量 <span class="t-lc"><a href="cpp-error-errno.html">errno</a></span> 报告错误。</td>
|
|
</tr>
|
|
</table>
|
|
<p>若实现支持 IEEE 浮点算术( IEC 60559 ),则要求 <span class="t-c"><span class="mw-geshi cpp source-cpp">math_errhandling <span class="sy3">&</span> MATH_ERREXCEPT</span></span> 非零。</p>
|
|
<p>识别下列浮点错误条件:</p>
|
|
<table class="wikitable">
|
|
<tr>
|
|
<th>条件</th>
|
|
<th>解释</th>
|
|
<th>errno</th>
|
|
<th>浮点异常</th>
|
|
<th>示例</th>
|
|
</tr>
|
|
<tr>
|
|
<td>定义域错误</td>
|
|
<td>参数在该运算的数学上的定义域之外(<a href="cpp-numeric-math.html">每个函数</a>的描述列出了要求的定义域错误)</td>
|
|
<td><span class="t-lc"><a href="cpp-error-errno_macros.html">EDOM</a></span></td>
|
|
<td><span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_INVALID</a></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-math-acos.html"><span class="kw1337">std::<span class="me2">acos</span></span></a><span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>极点错误</td>
|
|
<td>函数的数学结果恰是无限大或未定义</td>
|
|
<td><span class="t-lc"><a href="cpp-error-errno_macros.html">ERANGE</a></span></td>
|
|
<td><span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_DIVBYZERO</a></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-math-log.html"><span class="kw1324">std::<span class="me2">log</span></span></a><span class="br0">(</span><span class="nu16">0.0</span><span class="br0">)</span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="nu16">1.0</span><span class="sy2">/</span><span class="nu16">0.0</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>上溢所致的值域错误</td>
|
|
<td>数学结果有限,但舍入后变为无限,或在向下舍入后变成最大可表示有限值</td>
|
|
<td><span class="t-lc"><a href="cpp-error-errno_macros.html">ERANGE</a></span></td>
|
|
<td><span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_OVERFLOW</a></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-math-pow.html"><span class="kw1332">std::<span class="me2">pow</span></span></a><span class="br0">(</span><a href="cpp-types-climits.html"><span class="kw418">DBL_MAX</span></a>,<span class="nu0">2</span><span class="br0">)</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>下溢所致的域错误</td>
|
|
<td>结果非零,但因为舍入变为零,或变成非正规并有精度损失</td>
|
|
<td><span class="t-lc"><a href="cpp-error-errno_macros.html">ERANGE</a></span> 或不改变(实现定义)</td>
|
|
<td><span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_UNDERFLOW</a></span> 或无(实现定义)</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-climits.html"><span class="kw415">DBL_TRUE_MIN</span></a><span class="sy2">/</span><span class="nu0">2</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>结果不准确</td>
|
|
<td>结果必须被舍入到目标类型</td>
|
|
<td>不改变</td>
|
|
<td><span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_INEXACT</a></span> 或无(未指定)</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-math-sqrt.html"><span class="kw1329">std::<span class="me2">sqrt</span></span></a><span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span></span></span>、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="nu16">1.0</span><span class="sy2">/</span><span class="nu16">10.0</span></span></span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E6.84.8F">注意</span></h3>
|
|
<p>通常, <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_INEXACT</a></span> 是否为数学库函数所引发是未指定的,但这可以显式指定于函数的描述(例如 <span class="t-lc"><a href="cpp-numeric-math-rint.html">std::rint</a></span> vs <span class="t-lc"><a href="cpp-numeric-math-nearbyint.html">std::nearbyint</a></span> )。</p>
|
|
<p>C++11 前,浮点异常是未指定的,要求对于任何定义域错误有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-error-errno_macros.html"><span class="kw810">EDOM</span></a></span></span> ,要求对上溢和实现定义的下溢有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-error-errno_macros.html"><span class="kw862">ERANGE</span></a></span></span> 。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <cfenv></span>
|
|
<span class="co2">#include <cmath></span>
|
|
<span class="co2">#include <cerrno></span>
|
|
<span class="co2">#include <cstring></span>
|
|
<span class="co2">#pragma STDC FENV_ACCESS ON</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1755">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"MATH_ERRNO is "</span>
|
|
<span class="sy1"><<</span> <span class="br0">(</span>math_errhandling <span class="sy3">&</span> MATH_ERRNO <span class="sy4">?</span> <span class="st0">"set"</span> <span class="sy4">:</span> <span class="st0">"not set"</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"MATH_ERREXCEPT is "</span>
|
|
<span class="sy1"><<</span> <span class="br0">(</span>math_errhandling <span class="sy3">&</span> MATH_ERREXCEPT <span class="sy4">?</span> <span class="st0">"set"</span> <span class="sy4">:</span> <span class="st0">"not set"</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<a href="cpp-numeric-fenv-feclearexcept.html"><span class="kw1447">std::<span class="me2">feclearexcept</span></span></a><span class="br0">(</span><a href="cpp-numeric-fenv-FE_exceptions.html"><span class="kw1458">FE_ALL_EXCEPT</span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw2">errno</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1755">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"log(0) = "</span> <span class="sy1"><<</span> <a href="cpp-numeric-math-log.html"><span class="kw1324">std::<span class="me2">log</span></span></a><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="kw1">if</span><span class="br0">(</span><span class="kw2">errno</span> <span class="sy1">==</span> <a href="cpp-error-errno_macros.html"><span class="kw862">ERANGE</span></a><span class="br0">)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1755">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"errno = ERANGE ("</span> <span class="sy1"><<</span> <a href="cpp-string-byte-strerror.html"><span class="kw1161">std::<span class="me2">strerror</span></span></a><span class="br0">(</span><span class="kw2">errno</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">")<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="kw1">if</span><span class="br0">(</span><a href="cpp-numeric-fenv-fetestexcept.html"><span class="kw1448">std::<span class="me2">fetestexcept</span></span></a><span class="br0">(</span><a href="cpp-numeric-fenv-FE_exceptions.html"><span class="kw1459">FE_DIVBYZERO</span></a><span class="br0">)</span><span class="br0">)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1755">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"FE_DIVBYZERO (pole error) reported<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">MATH_ERRNO is set
|
|
MATH_ERREXCEPT is set
|
|
log(0) = -inf
|
|
errno = ERANGE (Numerical result out of range)
|
|
FE_DIVBYZERO (pole error) reported</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</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-error-errno.html"><span class="t-lines"><span>errno</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>展开成 POSIX 兼容的线程局域错误号变量的宏<br />
|
|
<span class="t-mark">(宏变量)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|