Длинный дубль - Long double
Плавающая точка форматы |
---|
IEEE 754 |
|
Другой |
В C и связанные языки программирования, длинный двойной
относится к плавающая точка тип данных это часто более точно, чем двойная точность хотя языковой стандарт требует, чтобы он был не менее точным, чем двойной
. Как и в случае с другими типами C с плавающей запятой, он не обязательно может отображаться в Формат IEEE.
длинный двойной
в C
История
В длинный двойной
тип присутствовал в исходном стандарте C 1989 года,[1] но поддержка была улучшена в версии стандарта C 1999 г. или C99, что расширило стандарт библиотека включить функции, работающие на длинный двойной
Такие как sinl ()
и strtold ()
.
Длинные двойные константы - это константы с плавающей точкой с суффиксами "L" или "l" (строчная L), например, 0,333333333333333333L. Без суффикса оценка зависит от FLT_EVAL_METHOD.
Реализации
На x86 архитектура, большинство C компиляторы реализуют длинный двойной
как 80-битная расширенная точность тип, поддерживаемый оборудованием x86 (обычно сохраняется как 12 или 16 байтов для поддержки выравнивание структуры данных ), как указано в C99 / C11 стандартов (арифметика с плавающей запятой IEC 60559 (приложение F)). Исключением является Microsoft Visual C ++ для x86, что делает длинный двойной
синоним для двойной
.[2] В Компилятор Intel C ++ в Microsoft Windows поддерживает повышенную точность, но требует / Клонг ‑ дабл
переключиться на длинный двойной
чтобы соответствовать формату повышенной точности оборудования.[3]
Компиляторы также могут использовать длинный двойной
для IEEE 754 двоичный формат с плавающей запятой четверной точности (двоичный128). Так обстоит дело с HP-UX,[4] Солярис /SPARC,[5] MIPS с 64-битной или n32 ABI,[6], 64-битная ARM (AArch64)[7] (в операционных системах, использующих стандартные соглашения о вызовах AAPCS, таких как Linux) и z / OS с FLOAT (IEEE)[8][9][10]. Большинство реализаций находится в программном обеспечении, но некоторые процессоры имеют аппаратная поддержка.
На некоторых PowerPC и SPARCv9 машины,[нужна цитата ] длинный двойной
реализуется как дабл-дабл арифметика, где длинный двойной
value рассматривается как точная сумма двух значений с двойной точностью, дающая точность не менее 106 бит; в таком формате длинный двойной
тип не соответствует Стандарт IEEE с плавающей запятой. Иначе, длинный двойной
это просто синоним двойной
(двойная точность), например на 32-битном РУКА[11], 64-битная ARM (AArch64) (в Windows[12] и macOS[13]) и на 32-битных MIPS[14] (старый ABI, a.k.a. o32).
С Компилятор GNU C, длинный двойной
- это 80-битная расширенная точность на процессорах x86 независимо от физической памяти, используемой для типа (которая может быть 96 или 128 бит),[15] На некоторых других архитектурах длинный двойной
возможно дабл-дабл (например, на PowerPC[16][17][18]) или 128-битный учетверенная точность (например, на SPARC[19]). Начиная с gcc 4.3, четырехкратная точность также поддерживается на x86, но как нестандартный тип __float128
скорее, чем длинный двойной
.[20]
Хотя архитектура x86 и, в частности, x87 инструкции с плавающей запятой на x86, поддерживает 80-битные операции повышенной точности, можно настроить процессор для автоматического округления операций до двойной (или даже одинарной) точности. И наоборот, в режиме расширенной точности расширенная точность может использоваться для промежуточных вычислений, генерируемых компилятором, даже если окончательные результаты сохраняются с более низкой точностью (т. Е. FLT_EVAL_METHOD == 2 ). С включенным gcc Linux, По умолчанию используется 80-битная расширенная точность; на нескольких BSD операционные системы (FreeBSD и OpenBSD ), по умолчанию используется режим двойной точности, и длинный двойной
операции эффективно сводятся к двойной точности.[21] (NetBSD 7.0 и новее, однако, по умолчанию используется 80-битная расширенная точность. [22]). Однако это можно отменить в рамках отдельной программы с помощью инструкции FLDCW «управляющее слово загрузки с плавающей запятой».[21] На x86_64 BSD по умолчанию использует 80-битную расширенную точность. Microsoft Windows с Visual C ++ также устанавливает процессор в режим двойной точности по умолчанию, но это снова может быть отменено в отдельной программе (например, с помощью _controlfp_s
функция в Visual C ++[23]). С другой стороны, компилятор Intel C ++ для x86 по умолчанию включает режим повышенной точности.[24] В IA-32 OS X, длинный двойной
- это 80-битная расширенная точность.[25]
Прочие характеристики
В CORBA (из спецификации 3.0, в которой используется "Стандарт ANSI / IEEE 754-1985 "в качестве ссылки)," тип данных long double представляет число с плавающей запятой двойного расширения IEEE, которое имеет показатель степени не менее 15 бит в длину и дробную часть со знаком не менее 64 бит ", с GIOP / IIOP CDR , чьи типы с плавающей запятой "точно соответствуют стандартным форматам IEEE для чисел с плавающей запятой", упорядочивая это как то, что кажется IEEE 754-2008 binary128 a.k.a. четырехкратная точность без использования этого имени.
Смотрите также
Рекомендации
- ^ ANSI / ISO 9899-1990 Американский национальный стандарт языков программирования - C, раздел 6.1.2.5.
- ^ Домашняя страница MSDN, о компиляторе Visual C ++
- ^ Сайт разработчика Intel
- ^ Hewlett Packard (1992). «Перенос программ на C». Руководство по переносимости HP-UX - компьютеры HP 9000 (PDF) (2-е изд.). С. 5-3 и 5-37.
- ^ солнце Руководство по численным вычислениям, Глава 2: Арифметика IEEE
- ^ "Справочник MIPSpro ™ N32 ABI" (PDF). 1999. Получено 2020-05-26.
- ^ «Стандарт вызова процедур для 64-битной архитектуры Arm® (AArch64)». 2020-10-01. В архиве (PDF) из оригинала 2020-10-02.
- ^ «Типы с плавающей точкой». 2020-10-09. Получено 2020-10-09.
- ^ Шварц, Эрик (22 июня 2015 г.). «Ускорители IBM z13 SIMD для работы с целыми числами, строками и числами с плавающей запятой» (PDF). Получено 13 июля, 2015.
- ^ Schwarz, E.M .; Крыговски, К. А. (сентябрь 1999 г.). "Устройство с плавающей запятой S / 390 G5". Журнал исследований и разработок IBM. 43 (5/6): 707–721. Дои:10.1147 / ряд 435.0707. Получено 10 октября, 2020.
- ^ "Справочник по компилятору инструментария ARM® Compiler, версия 5.03" (PDF). 2013. Раздел 6.3 Основные типы данных. Получено 2019-11-08.
- ^ "llvm / llvm-project". GitHub. Получено 2020-09-03.
- ^ "llvm / llvm-project". GitHub. Получено 2020-09-03.
- ^ "Двоичный интерфейс приложения System V: Дополнение к процессору MIPS (r)" (PDF) (3-е изд.). 1996 г.. Получено 2020-05-26.
- ^ Использование коллекции компиляторов GNU, параметры x86.
- ^ Использование GNU Compiler Collection, RS / 6000 и параметров PowerPC
- ^ Внутри Macintosh - числовые значения PowerPC В архиве 2012-10-09 в Wayback Machine
- ^ 128-битные длинные подпрограммы двойной поддержки для Дарвина
- ^ Параметры SPARC
- ^ Примечания к выпуску GCC 4.3
- ^ а б Брайан Дж. Гоф и Ричард М. Столлман, Введение в GCC, раздел 8.6 Проблемы с плавающей точкой (Network Theory Ltd., 2004).
- ^ «Значительные изменения с NetBSD 6.0 на 7.0».
- ^ _controlfp_s, Сеть разработчиков Microsoft (2/25/2011).
- ^ Документация по компилятору Intel C ++, Использование параметра -fp-model (/ fp).
- ^ https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/130-IA-32_Function_Calling_Conventions/IA32.html