1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 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.12.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"> 11</head> 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> 20</tr></table> 21<hr> 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> 24</div> 25<div class="section"> 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> 30<p> 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>). 36 </p> 37<p> 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 50 type. 51 </p> 52<h5> 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> 56 </h5> 57<p> 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. 61 </p> 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> 68 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> 72 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> 76 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> 80 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> 84</pre> 85<p> 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). 90 </p> 91<p> 92 The number of bits in just the significand can be determined using: 93 </p> 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> 95</pre> 96<p> 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>. 102 </p> 103<p> 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: 105 </p> 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> 114</pre> 115<p> 116 and the number of 'guaranteed' decimal digits using 117 </p> 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> 119</pre> 120<p> 121 and the maximum number of possibly significant decimal digits using 122 </p> 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> 124</pre> 125<div class="tip"><table border="0" summary="Tip"> 126<tr> 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> 129</tr> 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>. 138 </p></td></tr> 139</table></div> 140<div class="note"><table border="0" summary="Note"> 141<tr> 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> 144</tr> 145<tr><td align="left" valign="top"> 146<p> 147 One could test that 148 </p> 149<p> 150 std::is_same<boost::floatmax_t, boost::float128_t>::value == true 151 </p> 152<p> 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>. 155 </p> 156</td></tr> 157</table></div> 158</div> 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>) 168 </p> 169</div></td> 170</tr></table> 171<hr> 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> 174</div> 175</body> 176</html> 177