Кіріспе

Сандық түрде бейнеленбейтін дерек мәні

Есептеуде 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-дердің бірінен алынуы керек; стандартта қайсысы екені көрсетілмейді.

Қасиетті 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-ды қайтарады немесе көрсету белгісіз форманы береді.