248 lines
24 KiB
HTML
248 lines
24 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-c_language_floating_constant 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="c.html">c</a>‎ | <a href="c-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>允许直接在表达式中使用浮点类型值。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<p>浮点常量是<a href="c-language-value_category.html">非左值</a>表达式,拥有下列形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">有效数字</span> <span class="t-spar">指数</span><span class="t-mark">(可选)</span> <span class="t-spar">后缀</span><span class="t-mark">(可选)</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中 <span class="t-spar">有效数字</span> 拥有形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">整数</span><span class="t-mark">(可选)</span> <code><b>.</b></code><span class="t-mark">(可选)</span> <span class="t-spar">小数</span><span class="t-mark">(可选)</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p><span class="t-spar">指数</span> 拥有形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>e</b></code> | <code><b>E</b></code> <span class="t-spar">指数符号</span><span class="t-mark">(可选)</span> <span class="t-spar">数字序列</span></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>p</b></code> | <code><b>P</b></code> <span class="t-spar">指数符号</span><span class="t-mark">(可选)</span> <span class="t-spar">数字序列</span></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 十进制浮点常量的指数语法</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 十六进制浮点常量的指数语法</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c23">
|
|
<td>
|
|
<p>数位间可插入作为分隔符的单引号(<code>'</code>),在编译时忽略它们。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c23">(C23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>若 <span class="t-spar">有效数字</span> 以字符序列 <code>0x</code> 或 <code>0X</code> 开始,则浮点常量为<i>十六进制浮点常量</i>。否则,它是<i>十进制浮点常量</i>。</p>
|
|
<p>对于<i>十六进制浮点常量</i>,将 <span class="t-spar">有效数字</span> 转译为十六进制小数,而将指数的 <span class="t-spar">数字序列</span> 转译为有效数字要乘的 2 的整数次幂。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">double</span> d <span class="sy1">=</span> 0x1.2p3<span class="sy4">;</span> <span class="co1">// 十六进制小数 1.2 (十进制 1.125 )乘 2^3 ,即 9.0</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>对于<i>十进制浮点常量</i>, <span class="t-spar">有效数字</span> 被转译为十进制小数,而将指数的 <span class="t-spar">数字序列</span> 转译为有效数字要乘的 10 的整数次幂。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">double</span> d <span class="sy1">=</span> <span class="nu19">1.2e3</span><span class="sy4">;</span> <span class="co1">// 十进制小数 1.2 乘 10^3 ,即 1200.0</span></pre></div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E5.90.8E.E7.BC.80">后缀</span></h4>
|
|
<p>无后缀浮点常量拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">double</span></span></span> 类型。若 <span class="t-spar">后缀</span> 为字母 <code><b>f</b></code> 或 <code><b>F</b></code> ,则浮点常量拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">float</span></span></span> 类型。若 <span class="t-spar">后缀</span> 为 <code><b>l</b></code> 或 <code><b>L</b></code> ,则浮点常量拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">long</span> <span class="kw4">double</span></span></span> 类型。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c23">
|
|
<td>
|
|
<p>若实现预定义宏 <code>__STDC_IEC_60559_BFP__</code> ,则额外支持下列后缀与对应的浮点常量:</p>
|
|
<ul>
|
|
<li>若 <span class="t-spar">后缀</span> 为 <code><b>df</b></code> 或 <code><b>DF</b></code> ,则浮点常量拥有 <span class="t-c"><span class="mw-geshi c source-c">_Decimal32</span></span> 类型;</li>
|
|
<li>若 <span class="t-spar">后缀</span> 为 <code><b>dd</b></code> 或 <code><b>DD</b></code> ,则浮点常量拥有 <span class="t-c"><span class="mw-geshi c source-c">_Decimal64</span></span> 类型;</li>
|
|
<li>若 <span class="t-spar">后缀</span> 为 <code><b>dl</b></code> 或 <code><b>DL</b></code> ,则浮点常量拥有 <span class="t-c"><span class="mw-geshi c source-c">_Decimal128</span></span> 类型。</li>
|
|
</ul>
|
|
<p>十六进制浮点常量中不允许十进制浮点类型的后缀。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c23">(C23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E5.8F.AF.E9.80.89.E9.83.A8.E5.88.86">可选部分</span></h4>
|
|
<p>若有指数而不用小数部分,则可以忽略小数分隔符:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">double</span> x <span class="sy1">=</span> <span class="nu19">1e0</span><span class="sy4">;</span> <span class="co1">// 浮点数 1.0 (不用小数点)</span></pre></div>
|
|
</div>
|
|
<p>对于十进制浮点常量, <span class="t-spar">指数</span> 部分是可选的。若忽略它,则小数点不是可选的,而且 <span class="t-spar">整数</span> 或 <span class="t-spar">小数</span> 必须存在。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">double</span> x <span class="sy1">=</span> <span class="nu0">1</span>.<span class="sy4">;</span> <span class="co1">// 浮点数 1.0 (小数部分可选)</span>
|
|
<span class="kw4">double</span> y <span class="sy1">=</span> <span class="nu18">.1</span><span class="sy4">;</span> <span class="co1">// 浮点数 0.1 (整数部分可选)</span></pre></div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>十六进制浮点常量的指数非可选,以避免误认 <code><b>f</b></code> 后缀为十六进制数字所导致的歧义结果。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E5.8F.AF.E8.A1.A8.E7.A4.BA.E5.80.BC">可表示值</span></h4>
|
|
<p>浮点常量的求值结果是最邻近的可表示值,或紧邻于最邻近可表示值的最大或最小可表示值,以实现定义行为选择(换言之,翻译期的<a href="c-numeric-fenv-FE_round.html">默认浮点方向</a>是实现定义的)。</p>
|
|
<p>所有拥有相同源码形式的浮点常量都转换到有相同值的同一内部格式。有不同形式的浮点常量,例如 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu16">1.23</span></span></span> 与 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu16">1.230</span></span></span> ,不需要转换到同一内部格式和值。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>若 <span class="t-lc"><a href="c-types-limits-FLT_EVAL_METHOD.html">FLT_EVAL_METHOD</a></span> 指示,可以转换浮点常量为大于其所指示类型的范围和精度。例如,常量 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu17">0.1f</span></span></span> 可能在表达式中表现为 <span class="t-c"><span class="mw-geshi c source-c">0.1L</span></span> 。</p>
|
|
<p>若 <span class="t-lc"><a href="c-types-limits.html">FLT_RADIX</a></span> 为 2,则十六进制浮点常量的求值结果,是浮点常量所表示的正确舍入到目标类型的准确值。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c23">
|
|
<td>
|
|
<p>拥有相同数值 <span class="mjax" style="display:none">\(\small x\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">x</span> ,但有不同量指数的十进制浮点类型的浮点常量,例如 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1230</span>.<span class="me1">dd</span></span></span>、 <span class="t-c"><span class="mw-geshi c source-c">1230.0dd</span></span> 及 <span class="t-c"><span class="mw-geshi c source-c">1.23e3dd</span></span> ,拥有可区别的内部表示。</p>
|
|
<p>十进制浮点类型的浮点常量的量指数 <span class="mjax" style="display:none">\(\small q\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">q</span> 在可能时,以 <span class="mjax" style="display:none">\(\small 10^q\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">10<span class="t-su">q<br /></span></span> 表示位于 <span class="t-spar">有效数字</span> 最低位的位置的 1 的方式确定。若按以上方式确定的量指数 <span class="mjax" style="display:none">\(\small q\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">q</span> 与系数 <span class="mjax" style="display:none">\(\small c = x\cdot 10^{-q}\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">c=x·10<span class="t-su">-q<br /></span></span> 不能以浮点常量的类型准确表示,则在类型的界限内按需增加 <span class="mjax" style="display:none">\(\small q\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">q</span> ,并对应地减少 <span class="mjax" style="display:none">\(\small c\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">c</span> ,进行需要的舍入。舍入可能导致零或无穷大。若在 <span class="mjax" style="display:none">\(\small q\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">q</span> 抵达最大值后(可能为舍入后的) <span class="mjax" style="display:none">\(\small c\)</span><span class="mjax-fallback texhtml" style="white-space: nowrap;">c</span> 仍在容许范围外,则产生的浮点常量拥有正无穷大值。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c23">(C23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>默认<a href="c-numeric-fenv-FE_round.html">舍入方向</a>和<a href="c-types-limits-FLT_EVAL_METHOD.html">精度</a>在浮点常量转换成内部表示时有效,而且不会引发<a href="c-numeric-fenv-FE_exceptions.html">浮点异常</a>,即使 <a href="c-preprocessor-impl.html"><tt>#pragma STDC FENV_ACCESS</tt></a> 生效(对于字符串的执行时转换,可使用 <span class="t-lc"><a href="c-string-byte-strtof.html">strtod</a></span> )。注意它和浮点类型的<a href="c-language-constant_expression.html">算术常量表达式</a>有别。</p>
|
|
<p>浮点常量中的字母是无关大小写的<span class="t-rev-inl t-since-c23"><span>,除了在十进制浮点类型的后缀中不能一同使用大写和小写</span> <span><span class="t-mark-rev t-since-c23">(C23 起)</span></span></span>: <span class="t-c"><span class="mw-geshi c source-c"><span class="nu12">0x1</span>.<span class="me1">ep</span><span class="sy2">+</span><span class="nu0">3</span></span></span> 与 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu12">0X1</span>.<span class="me1">EP</span><span class="sy2">+</span><span class="nu0">3</span></span></span> 表示同一浮点值 15.0 。</p>
|
|
<p><span class="t-lc"><a href="c-locale-setlocale.html">setlocale</a></span> 中指定的小数点对浮点常量语法无效:小数点始终是点。</p>
|
|
<p>不同于整数,不是每个浮点值都能以十进制<span class="t-rev-inl t-since-c99"><span>或十六进制</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>常量语法表示<span class="t-rev-inl t-since-c99"><span>:宏 <a href="c-numeric-math-NAN.html"><tt>NAN</tt></a> 和 <a href="c-numeric-math-INFINITY.html"><tt>INFINITY</tt></a> 以及如 <span class="t-lc"><a href="c-numeric-math-nan.html">nan</a></span> 的函数提供生成这些特殊值的方式</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>。注意 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu12">0x1</span>.<span class="me1">FFFFFEp128f</span></span></span> ,可能作为 IEEE float NaN 出现,实际上它在该格式中溢出到无穷大。</p>
|
|
<p>没有负浮点常量;如 <span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">-</span><span class="nu16">1.2</span></span></span> 的表达式被视为<a href="c-language-operator_arithmetic.html">算术运算符</a>一元负作用于浮点常量 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu16">1.2</span></span></span> 。注意可通过 <span class="t-lc">-0.0</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="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdio.h></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"15.0 = %a<span class="es1">\n</span>"</span>, <span class="nu16">15.0</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"0x1.ep+3 = %f<span class="es1">\n</span>"</span>, <span class="nu12">0x1</span>.<span class="me1">ep</span><span class="sy2">+</span><span class="nu0">3</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 超出 double 范围的常量。</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"+2.0e+308 --> %g<span class="es1">\n</span>"</span>, <span class="nu19">2.0e+308</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"+1.0e-324 --> %g<span class="es1">\n</span>"</span>, <span class="nu19">1.0e-324</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"-1.0e-324 --> %g<span class="es1">\n</span>"</span>, <span class="sy2">-</span><span class="nu19">1.0e-324</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"-2.0e+308 --> %g<span class="es1">\n</span>"</span>, <span class="sy2">-</span><span class="nu19">2.0e+308</span><span class="br0">)</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">15.0 = 0x1.ep+3
|
|
0x1.ep+3 = 15.000000
|
|
+2.0e+308 --> inf
|
|
+1.0e-324 --> 0
|
|
-1.0e-324 --> -0
|
|
-2.0e+308 --> -inf</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-17">
|
|
<ul>
|
|
<li>C17 标准(ISO/IEC 9899:2018):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.4.4.2 Floating constants (p: 47-48)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.4.4.2 Floating constants (p: 65-66)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.4.4.2 Floating constants (p: 57-58)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.1.3.1 Floating constants</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<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>
|