Why are double and long double completely the same on my 64 bit machine?

5.6k views Asked by At

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.

2

There are 2 answers

3
Yuushi On BEST ANSWER

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.

8
James Kanze On

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.