длинный двойной

редактировать

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

СОДЕРЖАНИЕ
  • 1 длинный дубль до мажор
    • 1.1 История
    • 1.2 Реализации
  • 2 Прочие характеристики
  • 3 См. Также
  • 4 ссылки
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 double80-битный расширенной точности на 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, также известное как учетверенная точность без использования этого имени.

Смотрите также
использованная литература
  1. ^ ANSI / ISO 9899-1990 Американский национальный стандарт языков программирования - C, раздел 6.1.2.5.
  2. ^ Домашняя страница MSDN, о компиляторе Visual C ++
  3. ^ Сайт разработчиков Intel
  4. ^ Hewlett Packard (1992). «Перенос программ на C». Руководство по переносимости HP-UX - компьютеры HP 9000 (PDF) (2-е изд.). С. 5-3 и 5-37.
  5. ^ Руководство по численным вычислениям Sun, Глава 2: Арифметика IEEE
  6. ^ "Справочник MIPSpro ™ N32 ABI" (PDF). 1999. Проверено 26 мая 2020.
  7. ^ «Стандарт вызова процедур для 64-битной архитектуры Arm® (AArch64)». 2020-10-01. Архивировано (PDF) из оригинала 2020-10-02.
  8. ^ "Типы с плавающей запятой". 2020-10-09. Проверено 9 октября 2020.
  9. ↑ Шварц, Эрик (22 июня 2015 г.). «Ускорители IBM z13 SIMD для целых чисел, строк и чисел с плавающей запятой» (PDF). Проверено 13 июля 2015 года.
  10. ^ Шварц, EM; Крыговски, Калифорния (сентябрь 1999 г.). «Устройство с плавающей запятой S / 390 G5». Журнал исследований и разработок IBM. 43 (5/6): 707–721. CiteSeerX   10.1.1.117.6711. DOI : 10.1147 / rd.435.0707. Проверено 10 октября, 2020.
  11. ^ «Справочник по компилятору инструментальной цепочки ARM®, версия 5.03» (PDF). 2013. Раздел 6.3 Основные типы данных. Проверено 8 ноября 2019.
  12. ^ "llvm / llvm-project". GitHub. Проверено 3 сентября 2020.
  13. ^ "llvm / llvm-project". GitHub. Проверено 3 сентября 2020.
  14. ^ "Двоичный интерфейс приложения System V: Дополнение к процессору MIPS (r)" (PDF) (3-е изд.). 1996. Проверено 26 мая 2020.
  15. ^ Использование коллекции компиляторов GNU, параметры x86.
  16. ^ Использование GNU Compiler Collection, RS / 6000 и параметров PowerPC
  17. ^ Внутри Macintosh - числовые данные PowerPC, заархивированные 9 октября 2012 г. на Wayback Machine
  18. ^ 128-битные длинные подпрограммы двойной поддержки для Дарвина
  19. ^ Параметры SPARC
  20. ^ Примечания к выпуску GCC 4.3
  21. ^ a b Брайан Дж. Гоф и Ричард М. Столлман, Введение в GCC, раздел 8.6 Проблемы с плавающей точкой (Network Theory Ltd., 2004).
  22. ^ «Значительные изменения с NetBSD 6.0 на 7.0».
  23. ^ _controlfp_s, Сеть разработчиков Microsoft (25.02.2011).
  24. ^ Документация по компилятору Intel C ++, использование параметра -fp-model (/ fp).
  25. ^ «Соглашения о вызове функций IA-32».
Последняя правка сделана 2023-04-21 01:32:47
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте