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

Из Википедии, бесплатной энциклопедии

В 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).

С помощью GNU C компилятора 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 четырехкратная точность без использования этого имени.

См. также [ править ]

Ссылки [ править ]

  1. ^ ANSI/ISO 9899-1990 Американский национальный стандарт языков программирования — C, раздел 6.1.2.5.
  2. ^ «Длинный дубль» . Learn.microsoft.com . Проверено 06 октября 2022 г.
  3. ^ Сайт разработчика Intel
  4. ^ Хьюлетт-Паккард (1992). «Портирование программ на языке C». Руководство по переносимости HP-UX — компьютеры HP 9000 (PDF) (2-е изд.). стр. 5-3 и 5-37.
  5. ^ «Арифметика IEEE» . docs.oracle.com . Проверено 06 октября 2022 г.
  6. ^ «Справочник MIPSpro™ N32 ABI» (PDF) . 1999 . Проверено 26 мая 2020 г.
  7. ^ «Стандарт вызова процедур для 64-битной архитектуры Arm® (AArch64)» . Гитхаб . 01.10.2020. Архивировано (PDF) из оригинала 02 октября 2020 г.
  8. ^ «Типы с плавающей запятой» . ИБМ . 09.10.2020 . Проверено 9 октября 2020 г.
  9. ^ Шварц, Эрик (22 июня 2015 г.). «Ускорители SIMD IBM z13 для целых, строк и чисел с плавающей запятой» (PDF) . Проверено 13 июля 2015 г.
  10. ^ Шварц, Э.М.; Крыговский, Калифорния (сентябрь 1999 г.). «Блок вычислений с плавающей запятой S / 390 G5». Журнал исследований и разработок IBM . 43 (5/6): 707–721. CiteSeerX   10.1.1.117.6711 . дои : 10.1147/рд.435.0707 .
  11. ^ «Сага о 128-битном двойнике Power ISA» . 22 декабря 2018 г. Проверено 26 декабря 2021 г.
  12. ^ «Справочник по компилятору набора инструментов ARM® Compiler, версия 5.03» (PDF) . 2013. Раздел 6.3 Основные типы данных . Проверено 08.11.2019 .
  13. ^ "llvm/llvm-проект" . Гитхаб . Проверено 3 сентября 2020 г.
  14. ^ "llvm/llvm-проект" . Гитхаб . Проверено 3 сентября 2020 г.
  15. ^ «Двоичный интерфейс приложения System V: дополнение процессора MIPS (r)» (PDF) (3-е изд.). 1996 год . Проверено 26 мая 2020 г.
  16. ^ «Параметры x86 (с использованием коллекции компиляторов GNU (GCC))» . gcc.gnu.org . Проверено 06 октября 2022 г.
  17. ^ «Опции RS/6000 и PowerPC (с использованием коллекции компиляторов GNU (GCC))» . gcc.gnu.org . Проверено 06 октября 2022 г.
  18. ^ Внутри Macintosh — числовые данные PowerPC, заархивированные 9 октября 2012 г. на Wayback Machine.
  19. ^ 128-битные длинные процедуры двойной поддержки для Дарвина
  20. ^ «Параметры SPARC (с использованием коллекции компиляторов GNU (GCC))» . gcc.gnu.org . Проверено 06 октября 2022 г.
  21. ^ «Серия выпусков GCC 4.3 — изменения, новые функции и исправления — проект GNU» . gcc.gnu.org . Проверено 06 октября 2022 г.
  22. ^ Перейти обратно: а б Брайан Дж. Гоф и Ричард М. Столлман, «Введение в GCC» , раздел 8.6. Проблемы с плавающей запятой (Network Theory Ltd., 2004).
  23. ^ «Значительные изменения с NetBSD 6.0 на 7.0» .
  24. ^ «Visual Studio 2005 Устаревшая документация» . Центр загрузки Microsoft . Проверено 06 октября 2022 г.
  25. ^ Документация по компилятору Intel C++, использование параметра -fp-model (/fp) .
  26. ^ «Соглашения о вызове функций IA-32» .