Reputation: 18514
int
is usually 32 bits, but in the standard, int
is not guaranteed to have a constant width. So if we want a 32 bit int
we include stdint.h
and use int32_t
.
Is there an equivalent for this for floats? I realize it's a bit more complicated with floats since they aren't stored in a homogeneous fashion, i.e. sign, exponent, significand. I just want a double
that is guaranteed to be stored in 64 bits with 1 sign bit, 10 bit exponent, and 52/53 bit significand (depending on whether you count the hidden bit).
Upvotes: 31
Views: 14978
Reputation: 147
From C++23 standard (ISO/IEC 14882:2023) there is <stdfloat>
.
cppreference.com mentions the following:
namespace std {
#if defined(__STDCPP_FLOAT16_T__)
using float16_t = /* implementation-defined */;
#endif
#if defined(__STDCPP_FLOAT32_T__)
using float32_t = /* implementation-defined */;
#endif
#if defined(__STDCPP_FLOAT64_T__)
using float64_t = /* implementation-defined */;
#endif
#if defined(__STDCPP_FLOAT128_T__)
using float128_t = /* implementation-defined */;
#endif
#if defined(__STDCPP_BFLOAT16_T__)
using bfloat16_t = /* implementation-defined */;
#endif
}
I am not aware of a C equivalent. However, you could try something like what is suggested here: https://stackoverflow.com/a/72440929/9962617
Upvotes: 2
Reputation: 179799
One of the biggest problems with these kind of "fixed width types" is that it's so easy to get it wrong. You probably didn't want a 32 bits integer. What's the point? WHat you did want is an integer type that can store at least 1>>31. That's long int
. You don't even need <stdint.h>
for that.
Similarly, your scripting language can implement an FP type that will work as long as the underlying C++ float
is at least 32 bits. Note that this still doesn't give you precise behavior. I'm fairly certain C++ doesn't guarantee -1.0/-3.0==1.0/3.0
Upvotes: -4
Reputation: 55009
According to the current C99 draft standard, annex F, that should be double. Of course, this is assuming your compilers meet that part of the standard.
For C++, I've checked the 0x draft and a draft for the 1998 version of the standard, but neither seem to specify anything about representation like that part of the C99 standard, beyond a bool in numeric_limits that specifies that IEEE 754/IEC 559 is used on that platform, like Josh Kelley mentions.
Very few platforms do not support IEEE 754, though - it generally does not pay off to design another floating-point format since IEEE 754 is well-defined and works quite nicely - and if that is supported, then it is a reasonable assumption that double is indeed 64 bits (IEEE 754-1985 calls that format double-precision, after all, so it makes sense).
On the off chance that double isn't double-precision, build in a sanity check so users can report it and you can handle that platform separately. If the platform doesn't support IEEE 754, you're not going to get that representation anyway unless you implement it yourself.
Upvotes: 7
Reputation: 58352
While I don't know of a type that guarantees a particular size and format, you do have a few options in C++. You can use the <limits>
header and its std::numeric_limits
class template to find out the size of a given type, std::numeric_limits::digits
tells you the number of bits in the mantissa, and std::numeric_limits::is_iec559
should tell you whether the type follows the IEEE format. (For sample code that manipulates IEEE numbers at the bit level, see the FloatingPoint class template in Google Test's gtest-internal.h.)
Upvotes: 6
Reputation: 9301
There's no variation in float/double that I'm aware of. Float has has been 32 bits for ages and double has been 64. Floating point semantics are pretty complicated, but there do exist constants in
#include <limits>
boost.numeric.bounds is a simpler interface if you don't need everything in std::numeric_limits
Upvotes: 1
Reputation: 1167
The other issue is representation of floating point numbers. This is usually based on the hardware on which you are running (but not always). Most system are using IEEE 754 Float point standards, but other can have their own standards as well (an example would be a VAX computer).
Wikipedia explaination of IEEE 754 http://en.wikipedia.org/wiki/IEEE_754-2008
Upvotes: 1
Reputation: 2192
Unfortunately, that's not guaranteed either. You have to check numeric_limits< T >
in
<limits>
.
But then again, I've never heard of an implementation where a double wasn't 64 bits long. If you wanted to just assume, you'd probably get away with it.
Upvotes: 0