Кіріспе
Сандық түрде бейнеленбейтін дерек мәні
Есептеуде NaN (/n//æ//n/), "Сан емес" дегенді білдіретін сандық дерек типінің (көбінесе қозғалатын нүктелі сан) нақтылы мәні, сан ретінде анықталмаған жағдайды көрсетеді, мысалы 0/0 есебінің нәтижесі. NaN-ды жүйелі түрде қолдану 1985 жылы IEEE 754 қозғалатын нүкте стандартымен бірге, шексіздік сияқты басқа да шексіз шамаларды бейнелеумен енгізілді. Математикада 0/0 нәтижесі әдетте сан ретінде анықталмайды, демек есептеу жүйелерінде NaN арқылы көрсетілуі мүмкін. Теріс санның квадрат түбірі нақты сан емес, сондықтан да сәйкес есептеу жүйелерінде NaN арқылы бейнеленеді. NaN есептеулерде мәліметтердің жоғалған мәнін көрсету үшін де қолданылуы мүмкін. NaN-ның екі түрі бар: тыныш NaN және сигнал беретін NaN. Тыныш NaN жарамсыз операциялар немесе мәндерден туындаған қателерді тарату үшін пайдаланылады. Сигнал беретін NaN сандық және символдық есептеулерді біріктіру сияқты кеңейтілген мүмкіндіктерді немесе қозғалатын нүктелі арифметиканың басқа да кеңейтімдерін қолдауға мүмкіндік береді.
Тыныш NaN
Жалпы, тыныш NaN немесе qNaN қосымша қателерді тудырмайды, себебі олар көптеген операциялар арқылы таралады. Бірақ, кейбір операциялар, жылжымалы нүктелік мән қайтармайтын, мысалы формат түрлендірулер немесе белгілі бір салыстыру операциялары, жарамсыз операция қатесін шығарады.
Пайдалы жүк операциялары
IEEE 754 2019 getPayload, setPayload және setPayloadSignaling операцияларын іске асыруды, қолданбаларды жеңілдету үшін пайдалы жүктемелерге қолжетімділікті стандарттауды ұсынады. IEEE 754 2019 аяғындағы құжатта бұл ұсыным "жаңа жүзеге асырулар үшін міндетті, бірақ бұрынғы нұсқаулармен үйлесімділікті сақтау шартымен" деп түсіндірілуі керек.
Кодтау
IEEE 754 алмасу форматтарында NaN-дер NaN-ге тән арнайы, алдын ала анықталған бит үлгілерімен анықталады. Белгі біті маңызды емес. Бинарлық форматтағы NaN-дер экспоненциалдық өрісі бірліктермен (шексіздік мәндері сияқты) және мәндік өрісте нөлден басқа санмен (шексіздік мәндерінен ерекшеленуі үшін) толтырылады. 1985 жылғы IEEE 754 стандарты (IEEE 754 1985) тек екілік қозғалмалы нүкте форматтарын сипаттады және сигнал беру/тыныш күйді қалай белгілеу керектігін көрсетпеді. Іс жүзінде, мәндік өрістің ең маңызды биті NaN-нің сигнал беретін немесе тыныш екенін анықтайды. Нәтижесінде екі түрлі іске асыру пайда болды, олардың мағыналары кері болды: көптеген процессорлар (Intel және AMD x86 отбасы, Motorola 68000 отбасы, AIM PowerPC отбасы, ARM отбасы, Sun SPARC отбасы және кейбір жаңа MIPS процессорлары) NaN тыныш болса, сигнал беру/тыныш битін нөлден басқаға, ал NaN сигнал берсе, нөлге орнатады. Осылайша, осы процессорларда бит – флагты білдіреді; PA RISC және ескі MIPS процессорларында NaN тыныш болса, сигнал беру/тыныш биті нөлге тең, ал NaN сигнал берсе, нөлден басқа болады. Осылайша, бұл процессорларда бит – флагты білдіреді. Бірінші таңдау артықшылыққа ие, себебі ол іске асыруға сигнал беру/тыныш битін 1-ге орнату арқылы сигнал беретін NaN-ді тыныштандыруға мүмкіндік береді. Екінші таңдаумен керісінше мүмкін емес, себебі сигнал беру/тыныш битін 0-ге орнату шексіздікке әкелуі мүмкін. IEEE 754 стандартының 2008 және 2019 жылғы жаңартылған нұсқалары сигнал беру/тыныш күйді кодтау үшін ресми талаптар мен ұсыныстарды ұсынады. Бинарлық алмасу форматтары үшін мәндік өрістің ең маңызды биті тыныш және сигнал беретін NaN-дерді ажырату үшін ғана қолданылады. (Бұл талап 2019 жылғы жаңартуда қосылды.) Сонымен қатар, ол – флаг болып табылады. Яғни, бұл бит NaN тыныш болса, нөлден басқа, ал NaN сигнал берсе, нөл болады. Ондық алмасу форматтары үшін, екілік немесе ондық кодталған болса да, NaN белгі бітінен кейінгі комбинация өрісінің ең жоғарғы бес биті бірлікке орнатылуымен анықталады. Өрістің алтыншы биті – флаг. Яғни, бұл бит NaN тыныш болса нөлге тең, ал NaN сигнал берсе, нөлден басқа болады. IEEE 754 2008 стандартымен сәйкестік үшін соңғы MIPS процессорларындағы сигнал беру/тыныш битінің мәні енді FCSR тіркелімінің NAN2008 өрісі арқылы конфигурацияланады. Бұл мүмкіндік MIPS Release 3-те міндетті емес, ал Release 5-те міндетті. Мәндік өрістің қалған биттерінің күйі/мәні стандартта анықталмаған. Бұл мән NaN-нің «жүктемесі» деп аталады. Егер операцияда бір ғана NaN кіріс болса және ол шығысқа таратылса, нәтижедегі NaN-нің жүктемесі кіріс NaN-нің жүктемесімен сәйкес болуы керек (бұл жоғарыда түсіндірілгендей, сигнал беру/тыныш күйі флагпен кодталғанда, екілік форматтарда әрқашан мүмкін емес). Егер бірнеше NaN кіріс болса, нәтижедегі NaN-нің жүктемесі кіріс NaN-дердің бірінен алынуы керек; стандартта қайсысы екені көрсетілмейді.
most processors (including those of the Intel and AMD's x86 family, the Motorola 68000 family, the AIM PowerPC family, the ARM family, the Sun SPARC family, and optionally new MIPS processors) set the signaling/quiet bit to non zero if the NaN is quiet, and to zero if the NaN is signaling. Thus, on these processors, the bit represents an flag;
in NaNs generated by the PA RISC and old MIPS processors, the signaling/quiet bit is zero if the NaN is quiet, and non zero if the NaN is signaling. Thus, on these processors, the bit represents an flag. The former choice has been preferred as it allows the implementation to quiet a signaling NaN by just setting the signaling/quiet bit to 1. The reverse is not possible with the latter choice because setting the signaling/quiet bit to 0 could yield an infinity. The 2008 and 2019 revisions of the IEEE 754 standard make formal requirements and recommendations for the encoding of the signaling/quiet state. For binary interchange formats, the most significant bit of the significand field is exclusively used to distinguish between quiet and signaling NaNs. (This requirement has been added in the 2019 revision.) Moreover, it should be an flag. That is, this bit is non zero if the NaN is quiet, and zero if the NaN is signaling. For decimal interchange formats, whether binary or decimal encoded, a NaN is identified by having the top five bits of the combination field after the sign bit set to ones. The sixth bit of the field is the flag. That is, this bit is zero if the NaN is quiet, and non zero if the NaN is signaling. For IEEE 754 2008 conformance, the meaning of the signaling/quiet bit in recent MIPS processors is now configurable via the NAN2008 field of the FCSR register. This support is optional in MIPS Release 3 and required in Release 5. The state/value of the remaining bits of the significand field are not defined by the standard. This value is called the 'payload' of the NaN. If an operation has a single NaN input and propagates it to the output, the result NaN's payload should be that of the input NaN (this is not always possible for binary formats when the signaling/quiet state is encoded by an flag, as explained above). If there are multiple NaN inputs, the result NaN's payload should be from one of the input NaNs; the standard does not specify which.
Қасиетті NaN
Бірқатар жүйелерде "каноникалық NaN" ұғымы бар, онда NaN кірісі жоқ қозғалатын нүктелік операциялардың нәтижесінде туындайтын жалғыз ғана qNaN ретінде нақты бір NaN мәні таңдалады. Бұл мән әдетте барлық нөлдерден тұратын жүктемесі және кездейсоқ анықталған таңба биті бар тыныш NaN болып таңдалады. RISC V жүйесінде қозғалатын нүктелік операциялар тек каноникалық NaN-ды ғана тудырады, тіпті егер операнд ретінде NaN берілсе де (жүктеме таратылмайды). ARM осы мінез-құлық үшін "дефолтты NaN" режимін қосуға мүмкіндік береді. WebAssembly да осыған ұқсас мінез-құлықты қолданады, бірақ екі каноникалық мәнге рұқсат береді. Java жүйесінде де "көбінесе" осылай қарастырылады. NaN өрнектемелерінің шектеулі саны жүйеге басқа мүмкін NaN мәндерін арифметикалық емес мақсаттарда пайдалануға мүмкіндік береді, ең маңыздысы – "NaN қорабы", яғни жүктемені кез келген деректер үшін пайдалану. (Бұл "каноникалық NaN" ұғымы IEEE 754 стандартындағы "каноникалық кодтау" ұғымынан өзгеше.)
Функцияның анықтамасы
Кіріс ретінде тыныш NaN санын қабылдайтын сандық функцияның нәтижесіне қатысты дұрыс анықтама туралы пікірлер әртүрлі. Бір көзқарас бойынша, NaN қателік туралы хабарламаны тарату үшін функцияның шығысына барлық жағдайларда тарауы керек. Басқа көзқарас, және жалпы алғанда ISO C99 және IEEE 754 2008 стандарттары, функцияда бірнеше аргумент болса және шығыс NaN емес барлық кірістермен (соның ішінде шексіздікпен) бірегей түрде анықталса, онда осы мән нәтиже болуы керек дейді. Мысалы, және мәндері +∞-ны қайтарады. Бұл мәселе, әсіресе, 1=pow(x, y) = xy экспоненциалдық функциясы үшін өте маңызды. 00, ∞0 және 1∞ өрнектері шектер ретінде пайда болғанда белгісіз формалар болып есептеледі (∞ × 0 сияқты), және нөлдің нөлге дәрежесін 1 деп анықтау керек пе деген мәселеде пікірлер екіге бөлінген. Егер шығыс, параметр анықталмаған жағдайда анықталмаған деп есептелсе, онда qNaN шығарылуы тиіс. Дегенмен, математикалық кітапханалар әдетте pow(1, y) үшін кез келген нақты y саны үшін 1-ді қайтарады, тіпті y шексіз болғанда да. Сол сияқты, олар x 0 немесе шексіз болғанда да pow(x, 0) үшін 1-ді қайтарады. IEEE 754 стандартының 2008 жылғы нұсқасы, және екеуі де 1-ді қайтарады дейді, себебі олар басқа нәрселердің орнына тыныш NaN қолданылған жағдайда да 1-ді қайтарады. Сонымен қатар, ISO C99 және кейіннен IEEE 754 2008 qNaN орнына 1=pow(−1, ±∞) = 1 деп белгілеуді таңдады; осы таңдаудың себебі C негіздемесінде келтірілген: "Жалпы, C99 сандық мән пайдалы болған жерде NaN нәтижесінен қашықтайды. Нәтижесі +∞, өйткені барлық үлкен оң қабаттасқан нүктелік мәндер жұп бүтін сандар болып табылады". Күш функциясының қалай әрекет етуі керек екеніне қатысты қатаң түсіндіруді қалайтындарды қанағаттандыру үшін 2008 жылғы стандарт екі қосымша күш функциясын анықтайды: pown(x, n), мұнда көрсеткіш бүтін сан болуы керек, және powr(x, y), бұл параметр NaN болғанда NaN-ды қайтарады немесе көрсету белгісіз форманы береді.