IEEE 754 и точность с плавающей запятой

Имеет ли значение 32- или 64-разрядный ЦП с точки зрения точности, которую обеспечивает IEEE 754?

При программировании на C я имею в виду, различаются ли размеры float, double и long double для 32- или 64-разрядных процессоров.


person Janus Gowda    schedule 24.07.2013    source источник


Ответы (4)


Нет, разницы нет, вы можете убедиться в этом, проверив sizeof(float) для обеих архитектур. Если вам нужна более высокая точность, используйте double.

person Geoffrey    schedule 24.07.2013
comment
Итак, 64-битный процессор не дает никаких преимуществ программистам на C математических приложений? - person Janus Gowda; 24.07.2013
comment
Не цитируйте меня по этому поводу, но производительность double на 64-битной должна быть выше, чем 32-битная, в зависимости от того, что вы делаете, поскольку двойное значение имеет длину 64 бита. Это также зависит от FPU. - person Geoffrey; 24.07.2013
comment
64-битный означает более широкую (более быструю) шину. Так что там будет некоторая скорость. 64-битный FPU также лучше обрабатывал бы удвоения. - person Jiminion; 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 часто реализуются как

  1. Тот же тип, что и double, или
  2. 128-битная учетверенная точность IEEE 754-2008 или
  3. 128-битный double-double

Хотя второй способ значительно увеличивает дальность и точность по сравнению с double, он также часто значительно медленнее из-за отсутствия поддержки оборудования.

Метод double-double приводит к типу с тем же диапазоном, но вдвое большей точностью, чем double, с преимуществом аппаратной поддержки double, т.е. вам не нужно полностью реализовывать программно, например, с четырехкратной точностью. Однако он не соответствует стандарту IEEE-754.

Если вы много занимаетесь математикой в ​​x86 или arm, переход на 64-разрядную версию будет лучше, потому что из-за увеличенного количества регистров SSE2 / Neon доступен по умолчанию ... что улучшает производительность по сравнению с 32-битной версией, в отличие от большинства других архитектур, где 64-битные программы часто работают медленнее из-за больших указателей.

person phuclv    schedule 28.07.2013

На большинстве 32-битных и 64-битных машин float является 32-битной плавающей точкой IEEE-754, а double - 64-битной плавающей точкой IEEE-754. Некоторые реализации могут использовать 80-битный тип IEEE-754 как double (или long double).

person Lee Daniel Crocker    schedule 24.07.2013

Если предположить, что float и double соответствуют числам IEEE-754 с одинарной и двойной точностью соответственно, тогда нет, нет никакой разницы.

long double, однако, может быть другой историей, поскольку компиляторы могут выбрать размер до равного.

person Drew McGowen    schedule 24.07.2013