2010-08-11 4 views
44

Я знаю, что размер различных типов данных может меняться в зависимости от того, в какой системе я включен. Я использую XP 32bits, и используя оператор sizeof() в C++, кажется, что long double равен 12 байтам, а double - 8.long double vs double

Однако большинство основных источников заявляют, что длинный двойной - 8 байтов, а диапазон следовательно, совпадает с двойным.

Почему у меня 12 байт? Если long double действительно составляет 12 байтов, разве это не расширяет диапазон значений? Или длинная подпись используется только (цифры компилятора), когда значение превышает диапазон двойника и, следовательно, выходит за пределы 8 байтов?

спасибо.

+2

Это худшая особенность в ISO C. Я категорически не рекомендую вам использовать ее. Это только приводит к проблемам, потому что спецификация настолько свободна. – Jeff

ответ

49

Цитируя Wikipedia:

На архитектуре x86, большинство компиляторов осуществить длинные дважды как 80-битную расширенный тип точности, поддерживаемый этого оборудованием (иногда хранятся в виде 12 или 16 байт для поддержания структуры данных

.

и

Составители могут также использовать длинные двойной для 128-битного четверной точности формате, который в настоящее время реализованных в программном обеспечении.

Другими словами, да, long doubleможет иметь возможность хранить больший диапазон значений, чем double. Но это полностью зависит от компилятора.

+2

Типы данных сильно зависят от архитектуры, для которой вы разрабатываете. – karlphillip

+0

Это также зависит от параметров компилятора. 80-битный тип может быть явно отключен почти для каждого компилятора x86. – greyfade

+1

@karlphillip, @greyfade: Да, я просто имел ввиду «до компилятора» в том смысле, что он решает, как хранить ваши данные. Очевидно, что он ограничен тем, что доступно на платформе, и, конечно же, компилятор может разрешить переопределение пользователя. – Borealid

2

Стандартные размеры байтов для чисел - это гарантированные минимальные размеры на всех платформах. В некоторых системах они могут быть больше, но они никогда не будут меньше.

1

Насколько мой опыт программирования новичка подсказывает:

  • Используйте periodicaly нормализованного поплавок [-1.0, + 1,0]

  • Удерживать значения нормализующего отдельно с двойным или длинным двойным

  • Нормализация вводит шум = небольшие ошибки = высокие частоты до значения переменных

  • Время от времени полезно для нормализации с медианным значением держать отдельно и хранить данные сортируются (исходный порядок данные могут быть сохранены , как перестановка вектора)

1

Для современных компиляторов на x64, Clang и GCC использования 16-байтовый двойной для long double, в то время как VC++ использует 8-байтовый двойной. Другими словами, с Clang и GCC вы получаете более высокую точность double, но для VC++ long double такая же, как у double. Современные процессоры x86 поддерживают эти 16-байтовые дубликаты, поэтому я думаю, что Clang и GCC делают все правильно и позволяют вам получить доступ к аппаратным возможностям более низкого уровня, используя примитивы языка более высокого уровня.