JavaRush /Java blogi /Random-UZ /Suzuvchi nuqtali raqam ichida nima bor va u qanday ishlay...
Ivan
Daraja
Харьков

Suzuvchi nuqtali raqam ichida nima bor va u qanday ishlaydi?

Guruhda nashr etilgan

Tarkib:

Rasm: http://pikabu.ru/

Kirish

Java tilini o'rganishning dastlabki kunlarida men suzuvchi nuqta raqamlari kabi qiziqarli turdagi primitivlarga duch keldim. Men darhol ularning xususiyatlariga va undan ham ko'proq ikkilik kodda (o'zaro bog'langan) yozilish usuli bilan qiziqdim. Butun sonlarning har qanday diapazonidan farqli o'laroq, hatto juda kichik diapazonda ham (masalan, 1 dan 2 gacha) ularning cheksiz soni mavjud. Va cheklangan xotira hajmiga ega bo'lgan holda, bu to'plamni ifodalash mumkin emas. Xo'sh, ular ikkilik tizimda qanday ifodalanadi va ular qanday ishlaydi? Afsuski, wikidagi tushuntirishlar va Habré haqidagi juda ajoyib maqola menga to'liq tushuncha bermadi, garchi ular poydevor qo'ygan bo'lsa ham. Tushunish faqat ushbu tahliliy maqolani o'qib chiqqandan keyin ertalab sodir bo'ldi.

Tarixga ekskursiya

( Habré haqidagi ushbu maqoladan olingan ) 60-70-yillarda, kompyuterlar katta va dasturlar kichik bo'lganida, hali ham hisob-kitoblar uchun yagona standart, shuningdek, suzuvchi nuqta sonini ifodalash uchun standart mavjud emas edi. Har bir kompyuter buni boshqacha qildi va har birining o'z xatolari bor edi. Ammo 70-yillarning o'rtalarida Intel qo'llab-quvvatlanadigan "yaxshilangan" arifmetikaga ega yangi protsessorlarni ishlab chiqarishga va shu bilan birga uni standartlashtirishga qaror qildi. Uni ishlab chiqish uchun professorlar Uilyam Kaxan va Jon Palmer (yo'q, pivo haqidagi kitoblarning muallifi emas) olib kelingan. Bir oz drama bor edi, lekin yangi standart ishlab chiqildi. Endi bu standart IEEE754 deb nomlanadi

Suzuvchi nuqtali raqamlar formati

Hatto maktab darsliklarida ham har bir kishi 1,2 × 10 3 yoki 1,2 E3 shaklidagi juda katta yoki juda kichik raqamlarni yozishning g'ayrioddiy usuliga duch keldi , bu 1,2 × 1000 = 1200 ga teng . Bu eksponensial belgilash usuli deb ataladi. Bunda biz sonni ifodalash bilan quyidagi formula yordamida ishlaymiz: N=M×n p , bu yerda
  • N = 1200 - natijada olingan raqam
  • M = 1,2 - mantis - kasr qismi, buyurtmalarni hisobga olmagan holda
  • n = 10 - tartibning asosi. Bunday holda va biz kompyuterlar haqida gapirmasak, asos 10 raqamidir
  • p = 3 - tayanch darajasi
Ko'pincha buyurtmaning asosi 10 deb qabul qilinadi va faqat mantis va asosning qiymati yozilib, ularni E harfi bilan ajratib turadi. Bizning misolimizda men ekvivalent yozuvlarni berdim 1,2 × 10 3 va 1,2 E3 Agar hamma narsa aniq bo'lsa va biz maktab o'quv dasturiga nostaljik ekskursiyani tugatgan bo'lsak, endi buni unutishni maslahat beraman, chunki suzuvchi nuqta raqamini shakllantirishda biz bilan shug'ullanamiz. o'nlik emas, ikkita kuch, ya'ni. n = 2 , butun uyg'un formula 1.2E3 buziladi va bu haqiqatan ham miyamni buzdi.

Belgi va daraja

Xo'sh, bizda nima bor? Natijada, bizda ikkilik raqam ham bor, u mantisdan iborat - biz kuchga ko'taradigan qism va quvvatning o'zi. Bundan tashqari, butun son turlarida bo'lgani kabi, suzuvchi nuqtali raqamlar ham belgini aniqlaydigan bitga ega - bu raqam ijobiy yoki salbiy bo'ladimi. Misol tariqasida men float32 bitdan iborat turni ko'rib chiqishni taklif qilaman. Ikki marta aniqlikdagi raqamlar bilan doublemantiq bir xil, faqat ikki barobar ko'p bitlar mavjud. 32 bitdan birinchi eng muhimi belgiga, keyingi 8 bit ko'rsatkichga - biz mantisani ko'taradigan quvvatga, qolgan 23 bit esa mantisaga ajratiladi. Ko'rsatish uchun misolni ko'rib chiqaylik: Suzuvchi nuqtali raqam ichida nima bor va u qanday ishlaydi - 1Birinchi bit juda oddiy. Agar birinchi bitning qiymati 0 bo'lsa , biz olgan raqam ijobiy bo'ladi . Bit 1 bo'lsa , u holda raqam manfiy bo'ladi . Keyingi 8 bitli blok ko'rsatkich blokidir. Ko'rsatkich oddiy sakkiz bitli son sifatida yoziladi va kerakli darajani olish uchun hosil bo'lgan sondan 127 ni ayirish kerak.Bizning holatlarimizda ko'rsatkichning sakkiz biti 10000001 ga teng . Bu 129 raqamiga to'g'ri keladi . Agar buni qanday hisoblash kerakligi haqida savolingiz bo'lsa, rasmda tezkor javob ko'rsatilgan. Kengaytirilgan versiyani har qanday Boolean algebra kursida olish mumkin. Suzuvchi nuqtali raqam ichida nima bor va u qanday ishlaydi - 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 Ushbu 8 bitdan olishimiz mumkin bo'lgan maksimal son 11111111 2 = 255 10 ekanligini hisoblash qiyin emas ( 2 va 10 pastki belgisi ikkilik va o'nlik sanoq tizimlarini bildiradi) Biroq, agar biz faqat ijobiy ko'rsatkich qiymatlaridan foydalansak. ( 0 dan 255 gacha ), keyin olingan sonlar kasrdan oldin ko'p sonlarga ega bo'ladi, lekin keyin emas? Darajaning salbiy qiymatlarini olish uchun hosil qilingan ko'rsatkichdan 127 ni ayirish kerak . Shunday qilib, darajalar oralig'i -127 dan 128 gacha bo'ladi . Bizning misolimizdan foydalansak, talab qilinadigan daraja 129-127 = 2 bo'ladi . Hozircha bu raqamni eslaylik.

Mantis

Endi mantis haqida. U 23 bitdan iborat, lekin boshida har doim boshqa birlik nazarda tutiladi, ular uchun bitlar ajratilmaydi. Bu maqsadga muvofiqlik va iqtisodiy sabablarga ko'ra amalga oshiriladi. Xuddi shu raqamni mantisga o'nli kasrdan oldin yoki keyin nol qo'shish orqali turli darajalarda ifodalash mumkin. Buni tushunishning eng oson yo'li o'nlik ko'rsatkich bilan: 120 000 = 1,2×10 5 = 0,12×10 6 = 0,012×10 7 = 0,0012×10 8 va hokazo. Biroq, mantisning boshiga belgilangan raqamni kiritish orqali biz har safar yangi raqamlarni olamiz. Keling, 23 bitimizdan oldin bittasi bilan yana bittasi bo'lishini tabiiy deb olaylik. Odatda bu bit qolganlardan nuqta bilan ajratiladi, ammo bu hech narsani anglatmaydi. Bu qulayroq 1. 111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Suzuvchi nuqtali raqam ichida nima bor va u qanday ishlaydi - 3Endi hosil bo'lgan mantisni chapdan o'ngga kuchga ko'tarish kerak, har qadamda quvvatni bir marta kamaytirish kerak. Biz hisoblash natijasida olingan quvvatning qiymatidan boshlaymiz, ya'ni 2 (men ikkita kuchning har bir qiymatini yozmaslik uchun ataylab oddiy misolni tanladim va ularni yuqoridagi jadvalda hisoblamadim. mos keladigan bit nolga teng) Suzuvchi nuqtali raqam ichida nima bor va u qanday ishlaydi - 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 va natijani oldi 7.5 , to'g'riligini tekshirish mumkin, masalan, ushbu havolada

Natijalar

Standart suzuvchi nuqtali raqam float32 bitdan iborat bo'lib, birinchi bit ishora (+ yoki -), keyingi sakkiztasi ko'rsatkich, keyingi 23 tasi mantis belgisi bo'yicha - agar bit 0 musbat son bo'lsa. Bit 1 salbiy bo'lsa. Eksponensial bo'yicha - biz bit bo'yicha o'nlik songa aylantiramiz (chapdan birinchi bit 128 , ikkinchisi 64 , uchinchisi 32 , to'rtinchisi 16 , beshinchisi 8 , oltinchisi 4 , ettinchisi 2 , sakkizinchisi 1 ), natijada olingan raqamdan 127 ni ayirib , biz boshlanadigan darajani olamiz. Mantisaga ko'ra - oldingi mavjud 23 bitga biz qiymati 1 bo'lgan yana bir bit qo'shamiz va undan biz olgan quvvatga ko'tarilishni boshlaymiz, bu quvvatni har bir keyingi bit bilan kamaytiramiz. Hammasi shu, bolalar! Suzuvchi nuqtali raqam ichida nima bor va u qanday ishlaydi - 5PS: Uy vazifasi sifatida, ushbu maqoladan foydalanib, suzuvchi nuqta raqamlari bilan ko'p sonli arifmetik operatsiyalarda aniq xatolar nima uchun yuzaga kelishi haqidagi versiyalaringizni sharhlarda qoldiring.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION