Кіріспе

Шығысы белгіленген мәндер диапазонына шектелген арифметика түрі. Қаныққан арифметика – арифметиканың барлық операциялары, мысалы қосу және көбейту, ең төменгі және ең жоғары мәндер арасындағы белгіленген диапазонға шектелген нұсқасы. Егер операцияның нәтижесі ең жоғары мәннен асып кетсе, ол ең жоғары мәнге ("шектеледі"); егер ол ең төменгі мәннен төмен болса, ең төменгі мәнге дейін шектеледі. Атауы мәннің шекті мәндерге жеткеннен кейін "қанығуынан" туындайды; ең жоғары мәнге қосымша қосу немесе ең төменгі мәннен азайту нәтижені өзгертпейді. Мысалы, егер мәндердің жарамды диапазоны -100-ден 100-ге дейін болса, келесі қанықтырылған арифметикалық операциялар мынадай мәндерді береді: 60 + 30 → 90. 60 + 43 → 100. (күтілген 103 емес). (60 + 43) − (75 + 25) → 0. (күтілген 3 емес). (100 − 100 → 0). 10 × 11 → 100. (күтілген 110 емес). 99 × 99 → 100. (күтілген 9801 емес). 30 × (5 − 1) → 100. (күтілген 120 емес). (30 × 4 → 100). (30 × 5) − (30 × 1) → 70. (күтілген 120 емес, ал бұрынғы 100 емес). (100 − 30 → 70). Міне, 0-ден 100-ге дейінгі диапазон үшін қанықтырылған азайтудың тағы бір мысалы: 30 − 60 → 0. (күтілген 30 емес). Осы мысалдардан көрініп тұрғандай, ассоциативтілік және дистрибутивтілік сияқты таныс қасиеттер қаныққан арифметикада орындалмауы мүмкін. Бұл оны абстрактілі математикада пайдалануды қиын етеді, бірақ ол цифрлық аппараттық және алгоритмдерде маңызды рөл атқарады, онда мәндердің ең жоғары және ең төменгі бейнеленетін диапазондары болады.

Қазіргі заманғы қолданысы

Әдетте, жалпы мақсаттағы микропроцессорлар толыққанды арифметиканы қолданып, бүтін сандық арифметикалық операцияларды іске асырмайды; оның орнына олар оңайрақ іске асырылатын модульдік арифметиканы пайдаланады, онда максималды мәннен асып кеткен шамалар 1-ден 12-ге дейінгі сағат сияқты ең төменгі мәнге дейін "қайта оралады". Аппараттық жабдықта модульдік арифметика, ең аз мәні нөл, ең жоғары мәні rn − 1 болатын (мұндағы r – радикс), тек ең төменгі n цифрларды қалдырып, қалғандарын жою арқылы жүзеге асырылуы мүмкін. Көбінесе қазіргі заманғы аппараттық құралдар бинарлық болғандықтан, радикс 2-ге тең, ал цифрлар – биттер. Дегенмен, толыққанды арифметиканы іске асыру қиын болғанымен, оның көптеген практикалық артықшылықтары бар. Нәтиже сандық тұрғыдан нақты жауапқа мүмкіндігінше жақын болады; 8 биттік бинарлық таңбалы арифметика үшін, егер дұрыс жауап 130 болса, толыққанды арифметикадан 127 жауабын алу, модульдік арифметикадан -126 жауабын алудан гөрі әлдеқайда түсінікті. Сол сияқты, 8 биттік бинарлық таңбасыз арифметика үшін, егер дұрыс жауап 258 болса, толыққанды арифметикадан 255 жауабын алу, модульдік арифметикадан 2 жауабын алудан гөрі түсінікті. Толыққанды арифметика сонымен қатар ағып кету битін немесе артық есептеулерді қажет етмей, қосылу мен көбейтудің ағып кетуін максималды немесе минималды мәнмен қарапайым салыстыру арқылы тұрақты түрде анықтауға мүмкіндік береді (егер деректер осы мәндерді қабылдауға рұқсат етілмесе). Бұдан өзге, толыққанды арифметика, әсіресе цифрлық сигналдарды өңдеуде көптеген мәселелер үшін тиімді алгоритмдерді қамтамасыз етеді. Мысалы, дыбыс сигналының күшін реттеу ағып кетуге әкелуі мүмкін, ал толыққанды арифметика дыбысқа оралудан гөрі айтарлықтай аз бұрмалау тудырады. Ғалымдар Г. А. Константинидес және т.б. айтқандай: :

Қолданылу

Қанығу арифметикалық операциялары көптеген заманауи платформаларда қол жетімді, әсіресе Intel MMX платформасы жасаған кеңейтулердің бірі, нақтырақ айтқанда, мұндай сигнал өңдеу қолданбалары үшін. Бұл мүмкіндік SSE2 және AVX2 бүтін сандар жиынтықтарында кеңейтілген нұсқаларда да қол жетімді. ARM NEON нұсқаулар жиынтығында да бар. Бүтін сандар үшін қанығу арифметикасы C, C++ сияқты бірқатар бағдарламалау тілдерінде де бағдарламалық түрде іске асырылған, мысалы, GNU Compiler Collection, LLVM IR және Eiffel. Бұл бағдарламашыларға ағып кетудің әсерін жақсырақ болжауға және түсінуге көмектеседі, ал компиляторлар жағдайында әдетте ең оңтайлы шешімді таңдайды. Қанығуды тек модульдік арифметикалық операциялар бар машинада бағдарламалық түрде тиімді іске асыру қиын, себебі қарапайым іске асырулар құбыржолдың үлкен кешігулерін тудыратын тармақталуларды қажет етеді. Дегенмен, бағдарламалық түрде тармақталусыз, тек модульдік арифметика мен биттік логикалық операцияларды қолдана отырып, қанықтырылған қосу және алу операцияларын іске асыруға болады, бұл операциялар барлық заманауи процессорларда және олардың алдыңғы нұсқаларында қол жетімді, соның ішінде барлық x86 процессорларында (түпнұсқа Intel 8086-ға дейін) және кейбір танымал 8-биттік процессорларда (олардың кейбіреулері, мысалы Zilog Z80, әлі де өндірісте). Екінші жағынан, қарапайым 8-биттік және 16-биттік процессорларда, құрастыру тілінде бағдарламаланған жағдайда, тармақталу алгоритмі жылдамдатылуы мүмкін, себебі құбыржолдар тоқтап тұруға бейім емес, және әр нұсқау әрқашан бірнеше сағат циклдарын алады. x86 процессорларында, ол ағып кету флагтары мен шартты жылжуларды қамтамасыз етеді, сондықтан өте қарапайым тармақталмаған кодты жасауға болады. Қанығу арифметикасы аппараттық бүтін сандық арифметика үшін осылайша аз танымал болғанымен, IEEE қозғалатын нүкте стандарты, шамамен нақты сандармен жұмыс істеу үшін ең танымал абстракция, қанығудың бір түрін қолданады, онда ағып кету «шексіздік» немесе «теріс шексіздік» түріне айналады, ал осы нәтижеге байланысты кез келген басқа операция бірдей мәнді шығарады. Бұл қарапайым қанықтыруға қарағанда артықшылығы бар, себебі кейіннен мәнін азайтатын операциялар, мысалы, есептеулерде, шатастыратын «әділ» нәтижеге әкелмейді. Сонымен қатар, келесі операцияларда да сақталатын немесе бірден тоқтатылатын «экспонента ағып кетуі» (және «экспонента төмен ағыны») сияқты арнайы күйлер болуы мүмкін, немесе IBM704 үшін FORTRAN-да (1956 жылдың қазанында) болғандай, аккумулятордың ағып кетуі тексерілуі мүмкін.