JavaRush /Java блогы /Random-KK /Жылжымалы нүктенің ішінде не бар және ол қалай жұмыс істе...
Ivan
Деңгей
Харьков

Жылжымалы нүктенің ішінде не бар және ол қалай жұмыс істейді?

Топта жарияланған

Мазмұны:

Сурет: http://pikabu.ru/

Кіріспе

Java тілін үйренудің алғашқы күндерінде мен өзгермелі нүкте сандары сияқты қарабайырлардың қызықты түрін кездестірдім. Мен олардың ерекшеліктеріне және одан да көп екілік codeта жазылу тәсіліне (ол өзара байланысты) қызығушылық танытты. Бүтін сандардың кез келген диапазонынан айырмашылығы, тіпті өте аз диапазонда (мысалы, 1-ден 2-ге дейін) олардың шексіз саны бар. Ал шектеулі жады өлшеміне ие болғандықтан, бұл жиынды білдіру мүмкін емес. Сонымен, олар екілік жүйеде қалай көрсетіледі және олар қалай жұмыс істейді? Өкінішке орай, викидегі түсініктемелер мен Хабре туралы өте керемет мақала негізін қалағанымен , маған толық түсінік бермеді. Түсіну осы талдау мақаласын оқығаннан кейін таңертең пайда болды.

Тарихқа экскурсия

( Хабредегі осы мақаладан алынған ) 60-70-ші жылдары компьютерлер үлкен және бағдарламалар шағын болған кезде, әлі де есептеулердің бірыңғай стандарты, сондай-ақ өзгермелі нүктелік санның өзін өрнектейтін стандарт болған жоқ. Әр компьютер мұны әртүрлі жасады және әрқайсысының өз қателері болды. Бірақ 70-ші жылдардың ортасында Intel қолдау көрсетілетін «жақсартылған» арифметикасы бар жаңа процессорлар жасауды және сонымен бірге оны стандарттауды шешті. Оны әзірлеу үшін профессор Уильям Кахан мен Джон Палмер (жоқ, сыра туралы кітаптардың авторы емес) әкелінді. Біраз драма болды, бірақ жаңа стандарт әзірленді. Енді бұл стандарт IEEE754 деп аталады

Жылжымалы нүктелі сандар пішімі

Тіпті мектеп оқулықтарында барлығы 1,2 × 10 3 немесе 1,2 E3 түріндегі өте үлкен немесе өте аз сандарды жазудың әдеттен тыс әдісіне тап болды , бұл 1,2 × 1000 = 1200 тең . Бұл көрсеткіштік белгілеу әдісі деп аталады. Бұл жағдайда санды өрнектеумен мына формуланы қолданамыз: N=M×n p , мұндағы
  • N = 1200 – алынған сан
  • М = 1,2 - мантисса - бұйрықтарды есепке алмаған бөлшек бөлігі
  • n = 10 - реттілік негізі. Бұл жағдайда және біз компьютерлер туралы айтпаған кезде, негіз 10 саны болып табылады
  • p = 3 - негіз дәрежесі
Көбінесе бұйрықтың негізі 10 деп есептеледі және тек мантисса мен негіздің мәні жазылады, оларды Е әрпімен бөледі. Біздің мысалда мен 1,2 × 10 3 және 1,2 E3 балама жазбаларды бердім . Егер бәрі түсінікті болса және біз мектеп бағдарламасына ностальгиялық экскурсияны аяқтаған болсақ, енді мен мұны ұмытып кетуді ұсынамын, өйткені өзгермелі нүкте санын қалыптастыру кезінде біз айналысамыз. ондық емес, екінің дәрежесі, яғни. n = 2 , бүкіл үйлесімді формула 1.2E3 бұзылды және бұл менің миымды бұзды.

Белгі және дәреже

Сонымен, бізде не бар? Нәтижесінде бізде екілік сан бар, ол мантиссадан тұрады - біз қуатқа көтеретін бөлік пен қуаттың өзінен. Сонымен қатар, бүтін сан түрлеріне тән сияқты, өзгермелі нүктелі сандарда таңбаны анықтайтын бит бар - сан оң немесе теріс болады. floatМысал ретінде 32 биттен тұратын түрін қарастыруды ұсынамын . Екі дәлдіктегі сандармен doubleлогика бірдей, тек екі есе көп бит бар. 32 биттің бірінші маңыздысы белгіге, келесі 8 бит көрсеткішке – біз мантиссаны көтеретін қуатқа, ал қалған 23 бит – мантиссаға бөлінеді. Көрсету үшін мысалды қарастырайық: Жылжымалы нүктелі санның ішінде не бар және ол қалай жұмыс істейді - 1Бірінші бит өте қарапайым. Егер бірінші биттің мәні 0 болса , онда біз алатын сан оң болады . Егер бит 1 болса , онда сан теріс болады . Келесі 8 биттік блок көрсеткіштік блок болып табылады. Көрсеткіш кәдімгі сегіз разрядты сан ретінде жазылған және қажетті дәрежені алу үшін алынған саннан 127-ні алып тастау керек.Біздің жағдайда көрсеткіштің сегіз биті 10000001 . Бұл 129 санына сәйкес келеді . Егер сізде мұны қалай есептеу керектігі туралы сұрақ туындаса, суретте жылдам жауап көрсетіледі. Кеңейтілген нұсқаны кез келген буль алгебра курсында алуға болады. Жылжымалы нүктелі санның ішінде не бар және ол қалай жұмыс істейді - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 Осы 8 биттен алатын максималды сан 11111111 2 = 255 10 ( 2 және 10 тармақшасы екілік және ондық санау жүйелерін білдіреді) екенін есептеу қиын емес. Алайда, егер біз тек оң дәрежелік мәндерді қолдансақ. ( 0 ден 255 ге дейін ), онда алынған сандар ондық бөлшектің алдында көп сандар болады, бірақ кейін емес пе? Дәреженің теріс мәндерін алу үшін құрылған көрсеткіштен 127-ні алып тастау керек . Осылайша, градус диапазоны -127-ден 128-ге дейін болады . Біздің мысалды пайдалана отырып, қажетті дәреже 129-127 = 2 болады . Әзірге бұл санды еске түсірейік.

Мантисса

Енді мантисса туралы. Ол 23 биттен тұрады, бірақ басында разрядтар бөлінбейтін басқа бірлік болады. Бұл мақсаттылық пен үнемділік үшін жасалады. Бірдей санды мантиссаға ондық үтірден бұрын немесе одан кейін нөлдерді қосу арқылы әртүрлі дәрежеде көрсетуге болады. Мұны ондық көрсеткішпен түсінудің ең оңай жолы: 120 000 = 1,2×10 5 = 0,12×10 6 = 0,012×10 7 = 0,0012×10 8 т.б. Дегенмен, мантиссаның басына бекітілген нөмірді енгізу арқылы біз әр уақытта жаңа нөмірлерді аламыз. Біздің 23 битке дейін біреуі бар тағы біреуі болатынын кәдімгідей қабылдайық. Әдетте бұл бит қалған бөліктерден нүкте арқылы бөлінеді, бірақ бұл ештеңені білдірмейді. Бұл ыңғайлырақ 1. 111000000000000000000000 Жылжымалы нүктенің ішінде не бар және ол қалай жұмыс істейді - 3Енді алынған мантисса солдан оңға қарай күшке көтерілуі керек, әр қадам сайын қуатты бір есе азайтады. Біз есептеу нәтижесінде алынған қуат мәнінен бастаймыз, яғни 2 (мен екінің дәрежесінің әрбір мәнін жазбау үшін әдейі қарапайым мысалды таңдадым және оларды жоғарыдағы кестеде есептемедім. сәйкес бит нөлге тең) Жылжымалы нүктенің ішінде не бар және ол қалай жұмыс істейді - 41×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0,5 = 4+2+1+0,5 = 7.5 және 7.5 нәтижесін алды , дұрыстығын, мысалы, осы сілтеме бойынша тексеруге болады

Нәтижелер

Стандартты өзгермелі нүктелі сан float32 биттен тұрады, бірінші бит таңба (+ немесе -), келесі сегізі дәреже көрсеткіші, келесі 23 мантисса Белгі бойынша - егер бит 0 оң сан болса. 1 бит теріс болса. Экспоненциалды түрде – разряд бойынша ондық санға түрлендіреміз (сол жақтан бірінші бит – 128 , екіншісі – 64 , үшінші – 32 , төртіншісі – 16 , бесіншісі – 8 , алтыншысы – 4 , жетінші – 2 , сегізінші - 1 ), алынған саннан 127-ні алып тастасақ , біз қандай дәрежеден бастайтынымызды аламыз. Мантисса бойынша - алдыңғы 23 битке біз 1 мәні бар тағы бір бит қосамыз және одан біз алған қуатқа дейін көтеріле бастаймыз, бұл қуатты әрбір келесі битпен азайтамыз. Міне, балалар, балалар! Жылжымалы нүктенің ішінде не бар және ол қалай жұмыс істейді - 5PS: Үй тапсырмасы ретінде осы мақаланы пайдалана отырып, өзгермелі нүкте сандары бар арифметикалық операциялардың көп санымен дәлдік қателерінің неліктен орын алатыны туралы нұсқаларыңызды түсініктемелерде қалдырыңыз.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION