JavaRush /Java блогу /Random-KY /Калкыма чекиттин ичинде эмне бар жана ал кантип иштейт?
Ivan
Деңгээл
Харьков

Калкыма чекиттин ичинде эмне бар жана ал кантип иштейт?

Группада жарыяланган

Мазмуну:

Сүрөт: http://pikabu.ru/

Киришүү

Java тorн үйрөнүүнүн алгачкы күндөрүндө мен калкыма чекиттүү сандар сыяктуу примитивдердин кызык түрүн көрдүм. Мен дароо эле алардын өзгөчөлүктөрүнө жана андан да көбүрөөк экorк codeдо жазылганына кызыктым (ал бири-бири менен байланышкан). Бүтүн сандардын ар кандай диапазонунан айырмаланып, өтө кичинекей диапазондо да (мисалы, 1ден 2ге чейин) алардын чексиз саны бар. Ал эми эс тутумунун чектүү өлчөмүнө ээ болгондуктан, бул топтомду билдирүү мүмкүн эмес. Ошентип, алар бинардык системада кандайча көрсөтүлөт жана алар кантип иштешет? Тилекке каршы, викидеги түшүндүрмөлөр жана бул жерде Хабре жөнүндө абдан сонун макала, алар пайдубалын түптөшсө да, мага толук түшүнүк берген жок. Бул талдоо макаланы окугандан кийин гана түшүнүү болду .

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

( Habré боюнча бул макаладан алынган ) 60-70-жылдары, компьютерлер чоң жана программалар кичинекей болгондо, дагы эле эсептөөлөр үчүн бирдиктүү стандарт, ошондой эле калкыма чекиттик сандын өзүн туюнтуучу стандарт болгон эмес. Ар бир компьютер муну ар кандай кылган жана ар биринин өз каталары болгон. Бирок 70-жылдардын ортосунда Intel колдоого алынган “жакшыртылган” арифметика менен жаңы процессорлорду жасап, ошол эле учурда аны стандартташтырууну чечти. Аны иштеп чыгуу үчүн профессорлор Уильям Кахан жана Джон Палмер (жок, сыра тууралуу китептердин автору эмес) алынып келинген. Бир аз драма болгон, бирок жаңы стандарт иштелип чыккан. Азыр бул стандарт IEEE754 деп аталат

Калкыма чекиттүү сан форматы

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

Кол жана даража

Ошентип, биз эмнени түшүнөбүз? Натыйжада, бизде экorк сан да бар, ал мантистен турат - биз күчкө көтөрө турган бөлүк жана күчтүн өзүнөн. Кошумчалай кетсек, бүтүн сандардын түрлөрү менен кеңири таралгандай, калкыма чекиттүү сандар белгини аныктай турган битке ээ - сан оң же терс болорун. Мисал катары, мен float32 биттен турган түрүн карап чыгууну сунуш кылам. Кош тактык сандары менен doubleлогика бирдей, болгону эки эсе көп бит бар. 32 биттин ичинен эң биринчиси белгиге, кийинки 8 бит көрсөткүчкө - мантиссаны көтөрө турган күчкө, ал эми калган 23 бит мантиссага бөлүнөт. Көрсөтүү үчүн, келгиле, бир мисалды карап көрөлү: Калкыма чекиттин ичинде эмне бар жана ал кантип иштейт - 1Биринчи бит абдан жөнөкөй. Эгерде биринчи биттин мааниси 0 болсо , анда биз алган сан оң болот . Эгерде бит 1 болсо , анда сан терс болот . 8 биттен турган кийинки блок - көрсөткүч блогу. Көрсөткүч нормалдуу сегиз биттик сан түрүндө жазылган жана керектүү даражаны алуу үчүн натыйжадагы сандан 127ди кемитүү керек.Биздин учурда көрсөткүчтүн сегиз биттери 10000001 . Бул 129 санына туура келет . Эгер сиз муну кантип эсептөө керек деген сурооңуз болсо, анда сүрөт тез жоопту көрсөтөт. Кеңейтилген versionны буль алгебрасынын каалаган курсунан алууга болот. Калкыма чекиттин ичинде эмне бар жана ал кантип иштейт - 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 экorк жана ондук санаруу системаларын билдирет) Бирок, эгерде биз оң көрсөткүчтүн маанилерин гана колдонсок ( 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. 11100000000000000000000000 Калкыма чекиттин ичинде эмне бар жана ал кантип иштейт - 3Эми мантиба солдон оңго күч-кубатка көтөрүлүшү керек, ар бир кадам менен бийликти төмөндөтүшү керек. Эсептөөнүн натыйжасында алган күчтүн маанисинен баштайбыз, б.а. 2 (экөөнүн даражасынын ар бир маанисин жазбаш үчүн мен атайылап жөнөкөй мисалды тандап алдым жана аларды жогорудагы tableда эсептеген жокмун. тиешелүү бит нөлгө барабар) Калкыма чекиттин ичинде эмне бар жана ал кантип иштейт - 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: Үй тапшырмасы катары, бул макаланы колдонуу менен, өзгөрмө сандар менен арифметикалык операциялардын көп санында так каталар эмне үчүн пайда болот деген versionларыңызды комментарийге калтырыңыз.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION