Является ли long double в C ++ реализацией двоичного кода IEEE128? - PullRequest
0 голосов
/ 11 октября 2018

С https://en.wikipedia.org/wiki/Long_double:

В C ++ long double относится к типу данных с плавающей запятой, который часто является более точным, чем двойная точность.Однако, как и в других типах C ++ с плавающей точкой, он не обязательно отображается в формате IEEE.

...

При использовании компилятора GNU C long double расширяется на 80 битТочность на процессорах x86 независимо от физической памяти, используемой для типа (которая может быть 96 или 128 бит).На некоторых других архитектурах long double может иметь double-double (например, на PowerPC) или 128-битную четверную точность (например, на SPARC).Начиная с gcc 4.3, в x86 также поддерживается четверная точность, но в качестве нестандартного типа __float128 вместо long double.

С gcc в Linux 80-битная расширенная точность является значением по умолчанию;в некоторых операционных системах BSD (FreeBSD и OpenBSD) режим двойной точности используется по умолчанию, а длинные двойные операции эффективно сокращаются до двойной точности.

Компилятор Intel C ++ для x86, с другой стороны, обеспечивает расширенный-точный режим по умолчанию.В OS X long double - это 80-битная расширенная точность.

Кажется, что действительно long double может не быть реализацией двоичного кода IEEE128, но почему бы не сделать так?Почему в некоторых случаях по умолчанию используется 80-битное представление?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Почему в некоторых случаях по умолчанию используется 80-битное представление?

Поскольку x87 поддерживает 80-битный формат расширенной точности IEEE-754 .Некоторые более поздние платформы, такие как Motorola 6888x, Intel i960 и Itanium, также поддерживают этот тип, поэтому для компиляторов имеет смысл использовать его для long double вместо того, чтобы прибегать к гораздо более медленной программной эмуляции

Это также причина, по которой PowerPC использует double-double для long double по умолчанию, поскольку вы можете использовать аппаратный модуль double, который значительно ускоряет операции.Старые ядра NVIDIA CUDA не имели аппаратной поддержки double, поэтому многие люди использовали float-float для большей точности.См. Эмуляция FP64 с 2 FP32 на графическом процессоре

Большинство других архитектур не имеют аппаратного обеспечения для типов с плавающей запятой более 64 бит, поэтому они выбрали формат четверной точности IEEE-754для простоты реализации и лучшей прямой совместимости, поскольку, если однажды поддержка 128-битной плавающей запятой придет к реальному оборудованию, это, скорее всего, будет IEEE-754 с четверной точностью.В настоящее время Sparc является единственной архитектурой с аппаратной поддержкой четверной точности

. Тем не менее, большинство компиляторов имеют опции для изменения основного формата для long double.Например, в GCC есть -mlong-double-64/80/128 и -m96/128bit-long-double для x86 и -mabi=ibmlongdouble/ieeelongdouble для PowerPC

0 голосов
/ 11 октября 2018

Почему в некоторых случаях по умолчанию используется 80-битное представление?

Поскольку некоторые платформы могут обеспечивать эффективные 80-битные операции с плавающей запятой в аппаратном обеспечении, но не 128-битныеиз них.Это то же самое объяснение, почему sizeof(int) не указано стандартом - на некоторых платформах 32-разрядные целые числа могут быть неэффективными / недоступными.

...