Почему double и long double полностью одинаковы на моей 64-битной машине?

этот вопрос может звучать как для начинающих, однако, когда я узнал, что я думал, что я либо новичок, либо мой комп чего-то не хватает:

int main()
{
    cout << sizeof(double) << endl;
    cout << sizeof(long double) << endl;

    cout << DBL_DIG << endl;
    cout << LDBL_DIG << endl;

    return 0;
}

ПРОГРАММА:

8

8

15

15

Я думал long double 10 байт и имеет 18 десятичных цифр, в то время как double составляет 8 байт и имеет 15 цифр, но, похоже, я ошибался.

почему это так?

использование MSVC 2010 на 64-битной машине.

2 ответов


в MSVC++, long double синоним double Как вы узнали. По-видимому, это должно воспользоваться наборами инструкций SSE/SSE2/SSE3, которые ограничены 64-разрядными операциями.

см. также здесь для получения дополнительной информации.


размер всех основных типов определяется реализацией, с минимальный. В частности, все, что вам гарантировано, это double не имеет меньшей точности и дальности, чем float и long double не имеет меньше точности и диапазона, чем double.

С точки зрения качества реализации компилятор должен дать вы лучшее, что предлагает оборудование. Многие (большинство?) архитектур есть два аппаратных поддерживаемых типа с плавающей запятой; на таких зодчие, double и long double будут идентичны. На некоторых архитектуры, возможно, имеет смысл иметь все три одинаковых. На Intel, качественная реализация будет иметь три разных типа, потому что это то, что предлагает аппаратное обеспечение (но реализация все равно будет совместимый, даже если все три типа с плавающей запятой идентичны). На с другой стороны, вы можете утверждать разные размеры для long double: 10 (никогда не видел), 12 (g++) или 16 байт, по причинам выравнивания (с некоторыми из этот неиспользуемые байты). Реализация для Intel, где long double и double идентичны, однако, просто низкого качества, а не несовместимой.