问题
This question may sound like for beginners, however when I found that out I thought I'm either a beginner or my comp is missing something:
int main()
{
cout << sizeof(double) << endl;
cout << sizeof(long double) << endl;
cout << DBL_DIG << endl;
cout << LDBL_DIG << endl;
return 0;
}
PROGRAM OUTPUT:
8
8
15
15
I thought long double
is 10 bytes and has 18 decimal digits while double
is 8 bytes and has 15 digits but it seems I was wrong.
Why is that so?
Using MSVC 2010 on 64bit machine.
回答1:
In MSVC++, long double
is a synonym for double
as you've found out. Apparently this is to take advantage of SSE/SSE2/SSE3 instruction sets which are limited to 64-bit operations.
See also here for more information.
回答2:
The size of all of the basic types is implementation defined, with
minimums. In particular, all that you are guaranteed is that double
doesn't have less precision and range than float
, and that long
double
doesn't have less precision and range than double
.
From a quality of implementation point of view, the compiler should give
you the best that the hardware offers. Many (most?) architectures only
have two hardware supported floating point types; on such architectures,
double
and long double
will normally be identical. On some
architectures, it might make sense to have all three identical. On
Intel, a quality implementation will have three different types, because
that's what the hardware offers (but an implementation would still be
compliant even if all three floating point types were identical). On
the other hand, you can argue different sizes for long double
: 10
(never seen), 12 (g++) or 16 bytes, for alignment reasons (with some of
the bytes unused). An implementation for Intel where long double
and
double
are identical is, however, simply poor quality, and not
non-conformant.
来源:https://stackoverflow.com/questions/8922216/why-are-double-and-long-double-completely-the-same-on-my-64-bit-machine