Форматы с плавающей запятой |
---|
IEEE 754 |
|
Другой |
|
В C и родственных языков программирования, long double
относится к плавающей точкой типа данных, которые часто более точным, чем двойной точности, хотя стандартный язык только требует, чтобы это было по крайней мере, так точно, как double
. Как и другие типы C с плавающей запятой, он не обязательно может отображаться в формате IEEE.
long double
в CЭтот long double
тип присутствовал в исходном стандарте C 1989 года, но поддержка была улучшена в версии стандарта C 1999 года, или C99, который расширил стандартную библиотеку, включив в нее функции, работающие с long double
такими как sinl()
и strtold()
.
Длинные двойные константы - это константы с плавающей запятой с суффиксом «L» или «l» (строчная L), например 0,333333333333333333L. Без суффикса оценка зависит от FLT_EVAL_METHOD.
На архитектуре x86 большинство компиляторов C реализуются long double
как 80-битный тип расширенной точности, поддерживаемый оборудованием x86 (обычно сохраняемый как 12 или 16 байтов для поддержания выравнивания структуры данных ), как указано в стандартах C99 / C11 (IEC 60559 с плавающей запятой). арифметика (приложение F)). Исключением является Microsoft Visual C ++ для x86, который long double
является синонимом double
. В Intel C ++ компилятор на Microsoft Windows поддерживает расширенную точность, но требует /Qlong‑double
выключателя, long double
чтобы соответствовать расширенному формату точность фурнитуры.
Компиляторы также могут использовать long double
для IEEE 754 двоичный формат с плавающей запятой четвертой точности (binary128). Это относится к HP-UX, Solaris / SPARC, MIPS с 64-разрядным или n32 ABI, 64-разрядным ARM (AArch64) (в операционных системах, использующих стандартные соглашения о вызовах AAPCS, например Linux) и z / OS. с FLOAT (IEEE). Большинство реализаций программно, но некоторые процессоры имеют аппаратную поддержку.
На некоторых машинах PowerPC и SPARCv9 long double
реализована как арифметика двойного-двойного, где long double
значение рассматривается как точная сумма двух значений двойной точности, что дает точность не менее 106 бит; с таким форматом long double
тип не соответствует стандарту с плавающей запятой IEEE. В противном случае long double
это просто синоним double
(двойной точности), например, на 32-битной ARM, 64-битной ARM (AArch64) (в Windows и macOS) и на 32-битных MIPS (старый ABI, также известный как o32).
С GNU C компилятор, long double
80-битный расширенной точности на x86 процессорах, независимо от физической памяти, используемой для данного типа (который может быть либо 96 или 128 бит), на некоторых других архитектур, long double
может быть двойной двойной (например, на PowerPC ) или 128-битная четырехкратная точность (например, на SPARC ). Начиная с gcc 4.3, четырехкратная точность также поддерживается на x86, но как нестандартный тип, __float128
а не long double
.
Хотя архитектура x86 и, в частности, инструкции x87 с плавающей запятой на x86, поддерживают 80-битные операции с расширенной точностью, можно настроить процессор на автоматическое округление операций до удвоенной (или даже одинарной) точности. И наоборот, в режиме повышенной точности повышенная точность может использоваться для промежуточных вычислений, генерируемых компилятором, даже если окончательные результаты сохраняются с более низкой точностью (т. Е. FLT_EVAL_METHOD == 2 ). В gcc в Linux по умолчанию используется 80-битная расширенная точность; в некоторых операционных системах BSD ( FreeBSD и OpenBSD ) по умолчанию используется режим двойной точности, и long double
операции фактически сводятся к двойной точности. ( NetBSD 7.0 и новее, однако, по умолчанию использует 80-битную расширенную точность). Тем не менее, это можно изменить в рамках отдельной программы с помощью инструкции FLDCW «управляющее слово загрузки с плавающей запятой». На x86_64 BSD по умолчанию используют 80-битную расширенную точность. Microsoft Windows с Visual C ++ также устанавливает процессор в режим двойной точности по умолчанию, но это снова может быть отменено в отдельной программе (например, с помощью _controlfp_s
функции в Visual C ++). С другой стороны, компилятор Intel C ++ для x86 по умолчанию включает режим повышенной точности. В IA-32 OS X long double
- это 80-битная расширенная точность.
В CORBA (из спецификации 3.0, которая использует « Стандарт ANSI / IEEE 754-1985 » в качестве ссылки), «тип данных long double представляет собой число с плавающей запятой с двойным расширением IEEE, имеющее показатель степени не менее 15 бит. длины и дробной части со знаком не менее 64 бита », с GIOP / IIOP CDR, чьи типы с плавающей запятой« точно соответствуют стандартным форматам IEEE для чисел с плавающей запятой », упорядочивая это как то, что кажется двоичным128 IEEE 754-2008, также известное как учетверенная точность без использования этого имени.