длинный двойной
с плавающей запятой Форматы |
---|
ИЭЭЭ 754 |
|
Другой |
Альтернативы |
В C и родственных языках программирования long double
относится к с плавающей запятой типу данных , который часто более точен, чем двойная точность, хотя стандарт языка требует, чтобы он был по крайней мере столь же точным, как double
. Как и другие типы с плавающей запятой в языке C, он не обязательно соответствует формату IEEE .
long double
в C [ править ]
История [ править ]
The long double
тип присутствовал в исходном стандарте C 1989 года, [1] но поддержка была улучшена в версии стандарта C 1999 года, или C99 , которая расширила стандартную библиотеку , включив в нее функции, работающие на long double
такой как sinl()
и strtold()
.
Длинные двойные константы — это константы с плавающей запятой с суффиксом «L» или «l» (строчная буква L), например, 0,333333333333333333333333333333333333L или 3,1415926535897932384626433832795029L для четырехкратной точности . Без суффикса оценка зависит от FLT_EVAL_METHOD .
Реализации [ править ]
В архитектуре x86 большинство компиляторов C реализуют long double
как 80-битный тип расширенной точности , поддерживаемый аппаратным обеспечением x86 (обычно хранится в виде 12 или 16 байтов для обеспечения выравнивания структуры данных ), как указано в стандартах C99 / C11 (арифметика с плавающей запятой IEC 60559 (Приложение F)). Исключением является Microsoft Visual C++ для x86, что делает long double
синоним слова double
. [2] Компилятор Intel C++ в Microsoft Windows поддерживает повышенную точность, но требует /Qlong‑double
переключиться на long double
чтобы соответствовать расширенному формату точности оборудования. [3]
Составители также могут использовать long double
для двоичного формата с плавающей запятой четырехкратной точности IEEE 754 (binary128). Так обстоит дело с HP-UX , [4] Солярис / СПАРК , [5] MIPS с 64-битным или n32 ABI , [6] 64-битный ARM (AArch64) [7] (в операционных системах, использующих стандартные соглашения о вызовах AAPCS, например Linux) и z/OS с FLOAT(IEEE) [8] [9] [10] . Большинство реализаций реализованы программно, но некоторые процессоры имеют аппаратную поддержку .
В некоторых PowerPC системах [11] long double
реализуется как арифметика дабл-дабл , где long double
значение рассматривается как точная сумма двух значений двойной точности, что дает точность не менее 106 бит; при таком формате long double
Тип не соответствует стандарту IEEE с плавающей запятой . В противном случае, long double
это просто синоним слова double
(двойная точность), например, на 32-битном ARM , [12] 64-битный ARM (AArch64) (в Windows [13] и macOS [14] ) и на 32-битном MIPS [15] (старый ABI, он же о32).
С помощью C компилятора GNU long double
это 80-битная расширенная точность на процессорах x86 независимо от физической памяти, используемой для этого типа (которая может быть 96 или 128 бит), [16] В некоторых других архитектурах long double
может быть дабл-дабл (например, на PowerPC [17] [18] [19] ) или 128-битная четверная точность (например, в SPARC [20] ). Начиная с gcc 4.3, четверная точность также поддерживается на x86, но как нестандартный тип __float128
скорее, чем long double
. [21]
Хотя архитектура x86 и, в частности, инструкции x87 с плавающей запятой в x86, поддерживают 80-битные операции повышенной точности, можно настроить процессор на автоматическое округление операций до двойной (или даже одинарной) точности. И наоборот, в режиме повышенной точности расширенная точность может использоваться для промежуточных вычислений, генерируемых компилятором, даже если окончательные результаты сохраняются с более низкой точностью (т. е. FLT_EVAL_METHOD == 2 ). В gcc в Linux по умолчанию используется 80-битная расширенная точность; в некоторых BSD операционных системах ( FreeBSD и OpenBSD ) по умолчанию используется режим двойной точности, и long double
операции эффективно сводятся к двойной точности. [22] ( Однако в NetBSD 7.0 и более поздних версиях по умолчанию используется 80-битная расширенная точность. [23] ). Однако это можно переопределить в отдельной программе с помощью инструкции FLDCW «загрузка управляющего слова с плавающей запятой». [22] В x86_64 BSD по умолчанию использует 80-битную расширенную точность. Microsoft Windows с Visual C++ также по умолчанию устанавливает процессор в режим двойной точности, но это снова можно переопределить в отдельной программе (например, с помощью _controlfp_s
функция в Visual C++ [24] ). С другой стороны, компилятор Intel C++ для x86 по умолчанию включает режим повышенной точности. [25] В IA-32 OS X long double
это 80-битная расширенная точность. [26]
Другие характеристики [ править ]
В CORBA (из спецификации 3.0, в которой в качестве ссылки используется стандарт ANSI/IEEE 754-1985 ) «тип данных long double представляет собой число с плавающей запятой с двойным расширением IEEE, показатель степени которого составляет не менее 15 бит. длиной и знаковой дробью не менее 64 битов», с GIOP/IIOP CDR, чьи типы с плавающей запятой «точно соответствуют стандартным форматам IEEE для чисел с плавающей запятой», упорядочивая это как то, что кажется IEEE 754-2008binary128 aka четырехкратная точность без использования этого имени.
См. также [ править ]
Ссылки [ править ]
- ^ ANSI/ISO 9899-1990 Американский национальный стандарт языков программирования — C, раздел 6.1.2.5.
- ^ «Длинный дубль» . Learn.microsoft.com . Проверено 06 октября 2022 г.
- ^ Сайт разработчика Intel
- ^ Хьюлетт-Паккард (1992). «Портирование программ на языке C». Руководство по переносимости HP-UX — компьютеры HP 9000 (PDF) (2-е изд.). стр. 5-3 и 5-37.
- ^ «Арифметика IEEE» . docs.oracle.com . Проверено 06 октября 2022 г.
- ^ «Справочник MIPSpro™ N32 ABI» (PDF) . 1999 . Проверено 26 мая 2020 г.
- ^ «Стандарт вызова процедур для 64-битной архитектуры Arm® (AArch64)» . Гитхаб . 01.10.2020. Архивировано (PDF) из оригинала 02 октября 2020 г.
- ^ «Типы с плавающей запятой» . ИБМ . 09.10.2020 . Проверено 9 октября 2020 г.
- ^ Шварц, Эрик (22 июня 2015 г.). «Ускорители SIMD IBM z13 для целых, строк и чисел с плавающей запятой» (PDF) . Проверено 13 июля 2015 г.
- ^ Шварц, Э.М.; Крыговский, Калифорния (сентябрь 1999 г.). «Блок вычислений с плавающей запятой S / 390 G5». Журнал исследований и разработок IBM . 43 (5/6): 707–721. CiteSeerX 10.1.1.117.6711 . дои : 10.1147/рд.435.0707 .
- ^ «Сага о 128-битном двойнике Power ISA» . 22 декабря 2018 г. Проверено 26 декабря 2021 г.
- ^ «Справочник по компилятору набора инструментов ARM® Compiler, версия 5.03» (PDF) . 2013. Раздел 6.3 Основные типы данных . Проверено 08.11.2019 .
- ^ "llvm/llvm-проект" . Гитхаб . Проверено 3 сентября 2020 г.
- ^ "llvm/llvm-проект" . Гитхаб . Проверено 3 сентября 2020 г.
- ^ «Двоичный интерфейс приложения System V: дополнение процессора MIPS (r)» (PDF) (3-е изд.). 1996 год . Проверено 26 мая 2020 г.
- ^ «Параметры x86 (с использованием коллекции компиляторов GNU (GCC))» . gcc.gnu.org . Проверено 06 октября 2022 г.
- ^ «Опции RS/6000 и PowerPC (с использованием коллекции компиляторов GNU (GCC))» . gcc.gnu.org . Проверено 06 октября 2022 г.
- ^ Внутри Macintosh — числовые данные PowerPC, заархивированные 9 октября 2012 г. на Wayback Machine.
- ^ 128-битные длинные процедуры двойной поддержки для Дарвина
- ^ «Параметры SPARC (с использованием коллекции компиляторов GNU (GCC))» . gcc.gnu.org . Проверено 06 октября 2022 г.
- ^ «Серия выпусков GCC 4.3 — изменения, новые функции и исправления — проект GNU» . gcc.gnu.org . Проверено 06 октября 2022 г.
- ↑ Перейти обратно: Перейти обратно: а б Брайан Дж. Гоф и Ричард М. Столлман, «Введение в GCC» , раздел 8.6. Проблемы с плавающей запятой (Network Theory Ltd., 2004).
- ^ «Значительные изменения с NetBSD 6.0 на 7.0» .
- ^ «Visual Studio 2005 Устаревшая документация» . Центр загрузки Microsoft . Проверено 06 октября 2022 г.
- ^ Документация по компилятору Intel C++, использование параметра -fp-model (/fp) .
- ^ «Соглашения о вызове функций IA-32» .