Почему двойной и длинный двойной абсолютно одинаковы на моей 64-битной машине? - PullRequest
9 голосов
/ 19 января 2012

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

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 ]

6 голосов
/ 19 января 2012

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

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

2 голосов
/ 19 января 2012

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

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

...