3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Exact-Width Floating-Point typedefs</title>
5 <link rel="stylesheet" href="../math.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../index.html" title="Math Toolkit 2.11.0">
8 <link rel="up" href="../cstdfloat.html" title="Chapter 3. Specified-width floating-point typedefs">
9 <link rel="prev" href="rationale.html" title="Rationale">
10 <link rel="next" href="minimum_typdefs.html" title="Minimum-width floating-point typedefs">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="rationale.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../cstdfloat.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="minimum_typdefs.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="math_toolkit.exact_typdefs"></a><a class="link" href="exact_typdefs.html" title="Exact-Width Floating-Point typedefs">Exact-Width Floating-Point
28 <code class="computeroutput"><span class="keyword">typedef</span></code>s</a>
29 </h2></div></div></div>
31 The <code class="computeroutput"><span class="keyword">typedef</span> <span class="keyword">float</span><span class="special">#</span><span class="identifier">_t</span></code>, with
32 # replaced by the width, designates a floating-point type of exactly # bits.
33 For example <code class="computeroutput"><span class="identifier">float32_t</span></code> denotes
34 a single-precision floating-point type with approximately 7 decimal digits
35 of precision (equivalent to binary32 in <a href="http://en.wikipedia.org/wiki/IEEE_floating_point" target="_top">IEEE_floating_point</a>).
38 Floating-point types in C and C++ are specified to be allowed to have (optionally)
39 implementation-specific widths and formats. However, if a platform supports
40 underlying floating-point types (conformant with <a href="http://en.wikipedia.org/wiki/IEEE_floating_point" target="_top">IEEE_floating_point</a>)
41 with widths of 16, 32, 64, 80, 128 bits, or any combination thereof, then
42 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">cstdfloat</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
43 does provide the corresponding <code class="computeroutput"><span class="keyword">typedef</span></code>s
44 <code class="computeroutput"><span class="identifier">float16_t</span><span class="special">,</span>
45 <span class="identifier">float32_t</span><span class="special">,</span>
46 <span class="identifier">float64_t</span><span class="special">,</span>
47 <span class="identifier">float80_t</span><span class="special">,</span>
48 <span class="identifier">float128_t</span><span class="special">,</span></code>
49 their corresponding least and fast types, and the corresponding maximum-width
53 <a name="math_toolkit.exact_typdefs.h0"></a>
54 <span class="phrase"><a name="math_toolkit.exact_typdefs.how_to_tell_which_widths_are_sup"></a></span><a class="link" href="exact_typdefs.html#math_toolkit.exact_typdefs.how_to_tell_which_widths_are_sup">How to
55 tell which widths are supported</a>
58 The definition (or not) of a <a class="link" href="macros.html" title="Floating-Point Constant Macros">floating-point
59 constant macro</a> is a way to test if a <span class="bold"><strong>specific
60 width floating-point</strong></span> is available on a platform.
62 <pre class="programlisting"><span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_FLOAT16_C</span><span class="special">)</span>
63 <span class="comment">// Can use boost::float16_t, perhaps a proposed __short_float.</span>
64 <span class="comment">// P0192R1, Adding Fundamental Type for Short Float,</span>
65 <span class="comment">// Boris Fomitchev, Sergei Nikolaev, Olivier Giroux, Lawrence Crowl, 2016 Feb14</span>
66 <span class="comment">// http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2016.pdf</span>
67 <span class="preprocessor">#endif</span>
69 <span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_FLOAT32_C</span><span class="special">)</span>
70 <span class="comment">// Can use boost::float32_t, usually type `float`.</span>
71 <span class="preprocessor">#endif</span>
73 <span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_FLOAT64_C</span><span class="special">)</span>
74 <span class="comment">// Can use boost::float64_t, usually type `double`, and sometimes also type `long double`.</span>
75 <span class="preprocessor">#endif</span>
77 <span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_FLOAT80_C</span><span class="special">)</span>
78 <span class="comment">// Can use boost::float80_t, sometimes type `long double`.</span>
79 <span class="preprocessor">#endif</span>
81 <span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_FLOAT128_C</span><span class="special">)</span>
82 <span class="comment">// Can use boost::float128_t. Sometimes type `__float128` or `_Quad`.</span>
83 <span class="preprocessor">#endif</span>
86 This can be used to write code which will compile and run (albeit differently)
87 on several platforms. Without these tests, if a width, say <code class="computeroutput"><span class="identifier">float128_t</span></code>
88 is not supported, then compilation would fail. (It is, of course, rare for
89 <code class="computeroutput"><span class="identifier">float64_t</span></code> or <code class="computeroutput"><span class="identifier">float32_t</span></code> not to be supported).
92 The number of bits in just the significand can be determined using:
94 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">digits</span>
97 and from this one can safely infer the total number of bits because the type
98 must be IEEE754 format, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">is_iec559</span>
99 <span class="special">==</span> <span class="keyword">true</span></code>,
100 so, for example, if <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">digits</span> <span class="special">==</span> <span class="number">113</span></code>, then
101 <code class="computeroutput"><span class="identifier">floatmax_t</span></code> must be<code class="computeroutput"> <span class="identifier">float128_t</span></code>.
104 The <span class="bold"><strong>total</strong></span> number of bits using <code class="computeroutput"><span class="identifier">floatmax_t</span></code> can be found thus:
106 <pre class="programlisting"><span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">fpbits</span> <span class="special">=</span>
107 <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">digits</span> <span class="special">==</span> <span class="number">113</span><span class="special">)</span> <span class="special">?</span> <span class="number">128</span> <span class="special">:</span>
108 <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">digits</span> <span class="special">==</span> <span class="number">64</span><span class="special">)</span> <span class="special">?</span> <span class="number">80</span> <span class="special">:</span>
109 <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">digits</span> <span class="special">==</span> <span class="number">53</span><span class="special">)</span> <span class="special">?</span> <span class="number">64</span> <span class="special">:</span>
110 <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">digits</span> <span class="special">==</span> <span class="number">24</span><span class="special">)</span> <span class="special">?</span> <span class="number">32</span> <span class="special">:</span>
111 <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">digits</span> <span class="special">==</span> <span class="number">11</span><span class="special">)</span> <span class="special">?</span> <span class="number">16</span> <span class="special">:</span>
112 <span class="number">0</span><span class="special">;</span> <span class="comment">// Unknown - not IEEE754 format.</span>
113 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">fpbits</span> <span class="special"><<</span> <span class="string">" bits."</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
116 and the number of 'guaranteed' decimal digits using
118 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">digits10</span>
121 and the maximum number of possibly significant decimal digits using
123 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">floatmax_t</span><span class="special">>::</span><span class="identifier">max_digits10</span>
125 <div class="tip"><table border="0" summary="Tip">
127 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../doc/src/images/tip.png"></td>
128 <th align="left">Tip</th>
130 <tr><td align="left" valign="top"><p>
131 <code class="computeroutput"><span class="identifier">max_digits10</span></code> is not always
132 supported, but can be calculated at compile-time using the Kahan formula,
133 <code class="computeroutput"><span class="number">2</span> <span class="special">+</span>
134 <span class="identifier">binary_digits</span> <span class="special">*</span>
135 <span class="number">0.3010</span></code> which can be calculated <span class="bold"><strong>at compile time</strong></span> using <code class="computeroutput"><span class="number">2</span>
136 <span class="special">+</span> <span class="identifier">binary_digits</span>
137 <span class="special">*</span> <span class="number">3010</span><span class="special">/</span><span class="number">10000</span></code>.
140 <div class="note"><table border="0" summary="Note">
142 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
143 <th align="left">Note</th>
145 <tr><td align="left" valign="top">
150 std::is_same<boost::floatmax_t, boost::float128_t>::value == true
153 but this would fail to compile on a platform where <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">float128_t</span></code>
154 is not defined. So it is better to use the MACROs <code class="computeroutput"><span class="identifier">BOOST_FLOATnnn_C</span></code>.
159 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
160 <td align="left"></td>
161 <td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
162 Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
163 Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
164 Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
165 Daryle Walker and Xiaogang Zhang<p>
166 Distributed under the Boost Software License, Version 1.0. (See accompanying
167 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
172 <div class="spirit-nav">
173 <a accesskey="p" href="rationale.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../cstdfloat.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="minimum_typdefs.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>