Кіріспе
C және оған ұқсас бағдарламалау тілдерінде, ұзын қос нүктелі дерек типі әдетте қос дәлдіктен гөрі жоғары дәлдікке ие болады, бірақ тіл стандарты оның қос дәлдіктен кем болмауын талап етеді. C-тің басқа қалқыма нүктелі типтері сияқты, ол міндетті түрде IEEE форматымен сәйкес келе бермейді.
In C and related programming languages, long double refers to a floating point data type that is often more precise than double precision though the language standard only requires it to be at least as precise as double. As with C's other floating point types, it may not necessarily map to an IEEE format.
Тарих
Ұзын қос тип 1989 жылғы C стандартында болған, бірақ C стандартының 1999 жылғы жаңартылуымен, немесе C99-мен қолдауы жақсартылды. Бұл жаңарту стандартты кітапхананы sinl және strtold сияқты ұзын қос типпен жұмыс жасайтын функцияларды қосу арқылы кеңейтті. Ұзын қос константалар – "L" немесе "l" (кіші әріпті L) префиксі қосылған қозғалмалы нүктелік константалар, мысалы, 0.3333333333333333333333333333333333333333L немесе 3.1415926535897932384626433832795029L – төрттік дәлдік үшін. Префиксіз бағалау FLT_EVAL_METHOD-қа байланысты.
Long double constants are floating point constants suffixed with "L" or "l" (lower case L), e. g., 0.3333333333333333333333333333333333L or 3.1415926535897932384626433832795029L for quadruple precision. Without a suffix, the evaluation depends on FLT EVAL METHOD.
Қолданылу
x86 архитектурасында көптеген C компиляторлары long double-ды x86 аппараттық құрылғысы қолдаған 80 биттік кеңейтілген дәлдік түрі ретінде іске асырады (әдетте дерек құрылымының сәйкестігін сақтау үшін 12 немесе 16 байт ретінде сақталады), бұл C99 / C11 стандарттарында (IEC 60559 қозғалатын нүктелі арифметика, F қосымшасы) көрсетілген. Бірақ Microsoft Visual C++ x86 үшін ерекшелік бар, ол long double-ды double-дың синонимі етеді. Microsoft Windows-тағы Intel C++ компиляторы кеңейтілген дәлдікті қолдайды, бірақ long double-дың аппараттық кеңейтілген дәлдік форматына сәйкес болуы үшін /Qlong-double опциясын қажет етеді. Компиляторлар long double-ды IEEE 754 төрт еселік дәлдікті екілік қозғалатын нүктелік форматта (binary128) пайдалануы мүмкін. Бұл HP UX, Solaris/SPARC, 64 бит немесе n32 ABI-ы бар MIPS, 64 бит ARM (AArch64) (Linux сияқты стандартты AAPCS шақыру конвенцияларын қолданатын операциялық жүйелерде) және z/OS FLOAT(IEEE) жүйелерінде осылай. Көптеген жағдайларда бұл бағдарламалық жасақтамада іске асырылады, бірақ кейбір процессорлар аппараттық қолдауға ие. Кейбір PowerPC жүйелерінде 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 x86 процессорларында, түріне қарамастан, қолданылатын физикалық жад көлемін ескермей, 80 биттік кеңейтілген дәлдікке ие (ол 96 немесе 128 бит болуы мүмкін). Ал кейбір басқа архитектураларда long double екі еселік (мысалы, PowerPC) немесе 128 биттік төрт еселік дәлдік (мысалы, SPARC) болуы мүмкін. GCC 4.3 нұсқасынан бастап x86-да төрт еселік дәлдік қолдалады, бірақ long double емес, float128 стандартты емес түрі ретінде. x86 архитектурасы, әсіресе x86-дағы x87 қозғалатын нүктелік нұсқаулары 80 биттік кеңейтілген дәлдік операцияларын қолдайды, бірақ процессорды операцияларды автоматты түрде double (немесе тіпті single) дәлдікке дейін дөңгелектеуге конфигурациялауға болады. Керісінше, кеңейтілген дәлдік режимінде кеңейтілген дәлдік аралық компилятор жасаған есептеулер үшін қолданылуы мүмкін, тіпті соңғы нәтижелер төмен дәлдікте сақталған жағдайда да (яғни FLT EVAL METHOD == 2). Linux-тағы gcc-де 80 биттік кеңейтілген дәлдік әдепкі параметр болып табылады; ал бірнеше BSD операциялық жүйелерінде (FreeBSD және OpenBSD) double дәлдік режимі әдепкі параметр болып табылады, және long double операциялары double дәлдікке дейін төмендетіледі. (Дегенмен, NetBSD 7.0 және одан кейінгі нұсқалары 80 биттік кеңейтілген дәлдік параметрін әдепкі параметр ретінде қолданады). Бірақ жеке бағдарламада FLDCW "қозғалатын нүктелік жүктеу басқару сөзі" нұсқаулығы арқылы бұл параметрді өзгертуге болады. Ал Intel C++ компиляторы x86 үшін кеңейтілген дәлдік режимін әдепкі параметр ретінде қосады. IA 32 OS X-те long double 80 биттік кеңейтілген дәлдікке ие.
Басқа да ерекшеліктер
CORBA-да (3.0 нұсқасының сипаттамасынан, ол "ANSI/IEEE Standard 754 1985" стандартын сілтеме ретінде қолданады), "ұзын қос дерек типі IEEE екі есе кеңейтілген қозғалмалы нүктелі санды білдіреді, оның экспонентасы кемінде 15 биттен және белгілі бөлшегі кемінде 64 биттен тұрады". GIOP/IIOP CDR, оның қозғалмалы нүктелі типтері "қозғалмалы нүктелі сандар үшін IEEE стандартының форматтарын нақтылай түседі", оны IEEE 754 2008 binary128, яғни төрт есе дәлдік ретінде, осы атауды қолданбай, кодтайды.