Имеет ли значение 32- или 64-разрядный ЦП с точки зрения точности, которую обеспечивает IEEE 754?
При программировании на C я имею в виду, различаются ли размеры float
, double
и long double
для 32- или 64-разрядных процессоров.
Имеет ли значение 32- или 64-разрядный ЦП с точки зрения точности, которую обеспечивает IEEE 754?
При программировании на C я имею в виду, различаются ли размеры float
, double
и long double
для 32- или 64-разрядных процессоров.
Нет, разницы нет, вы можете убедиться в этом, проверив sizeof(float)
для обеих архитектур. Если вам нужна более высокая точность, используйте double
.
double
на 64-битной должна быть выше, чем 32-битная, в зависимости от того, что вы делаете, поскольку двойное значение имеет длину 64 бита. Это также зависит от FPU.
- person Geoffrey; 24.07.2013
В большинстве архитектур, использующих IEEE-754, float
и double
являются точными 32- и 64-битными типами, соответствующими одинарной и двойной точности соответственно. Следовательно, точность одинакова на 32- или 64-разрядном компьютере. Исключение составляют некоторые микроконтроллеры с нестандартными компиляторами C, в которых double
и float
одинаковы и содержат 32 бита.
Поддержка OTOH long double
зависит от системы. В x86 большинство реализаций будет использовать аппаратный тип 80-битной расширенной точности (часто с дополнением до 12 или 16 байт для сохранения выравнивания), кроме MSVC, где long double
- это просто псевдоним для double
. На других архитектурах long double
часто реализуются как
double
, илиХотя второй способ значительно увеличивает дальность и точность по сравнению с double
, он также часто значительно медленнее из-за отсутствия поддержки оборудования.
Метод double-double
приводит к типу с тем же диапазоном, но вдвое большей точностью, чем double
, с преимуществом аппаратной поддержки double
, т.е. вам не нужно полностью реализовывать программно, например, с четырехкратной точностью. Однако он не соответствует стандарту IEEE-754.
Если вы много занимаетесь математикой в x86 или arm, переход на 64-разрядную версию будет лучше, потому что из-за увеличенного количества регистров SSE2 / Neon доступен по умолчанию ... что улучшает производительность по сравнению с 32-битной версией, в отличие от большинства других архитектур, где 64-битные программы часто работают медленнее из-за больших указателей.
На большинстве 32-битных и 64-битных машин float
является 32-битной плавающей точкой IEEE-754, а double
- 64-битной плавающей точкой IEEE-754. Некоторые реализации могут использовать 80-битный тип IEEE-754 как double (или long double).
Если предположить, что float
и double
соответствуют числам IEEE-754 с одинарной и двойной точностью соответственно, тогда нет, нет никакой разницы.
long double
, однако, может быть другой историей, поскольку компиляторы могут выбрать размер до равного.