5-bo‘lim
Haqiqiy sonlar - IEEE 754
Nima uchun 0,1 + 0,2 aniq 0,3 bermaydi, IEEE 754 bit tuzilishi, maxsus qiymatlar va pul bilan ishlashda nima qilish kerak.
Ushbu bo‘lim mundarijasi
Har bir dasturchi bir kun shu savolga duch keladi:
>>> 0.1 + 0.2
0.30000000000000004
Bu xato emas. Bu - cheksiz sonni cheklangan bitlarga sig'dirishning muqarrar narxi.
Sabab: ikkilikda aniq yozilmaydi #
Eng mashhur "xato" shu:
| Amal | Natija |
|---|---|
0,1 + 0,2 | 0,30000000000000004 |
0,3 ga tengmi | yo'q |
Bu xato emas. Sabab shundaki, bu sonlar ikkilikda aniq yozilmaydi. Kompyuter ularni shunday saqlaydi:
| Yozganingiz | Aslida saqlangani |
|---|---|
| 0,1 | 0,1000000000000000055511151231257827... |
| 0,2 | 0,2000000000000000111022302462515654... |
| yig'indi | 0,3000000000000000444089209850062616... |
| 0,3 | 0,2999999999999999888977697537484345... |
Ko'rinib turibdiki, yig'indi va 0,3 boshqa-boshqa
sonlar - garchi farq juda kichik bo'lsa ham.
O'nlik sanoq sistemasida ham xuddi shunday muammo bor:
| Kasr | Qaysi sistemada aniq yozilmaydi |
|---|---|
| 1/3 | o'nlikda: 0,3333... |
| 1/10 | ikkilikda: 0,000110011... |
Ikkilikda aniq yoziladigan kasrlar - bu 2 ning darajalari:
| Son | Aniq saqlanadimi |
|---|---|
| 0,5 | ha |
| 0,25 | ha |
| 0,75 | ha |
| 0,125 | ha |
| 2,5 | ha |
| 0,1 | yo'q |
Mana asosiy nuqta: kompyuter 0.1 ni saqlamaydi. U
0.1000000000000000055511... ni saqlaydi - eng yaqin
ifodalanadigan son.
Xuddi shu natijani deyarli har qanday kalkulyator va har qanday dasturlash tili beradi. Sabab dasturda emas, IEEE 754 standartida - uni deyarli barcha protsessorlar apparat darajasida bajaradi.
Standart 1985-yilda qabul qilingan va uning asosiy muallifi Uilyam Kahan bu ish uchun 1989-yilda Tyuring mukofotini olgan.
Undan oldin har ishlab chiqaruvchining o'z formati bor edi va bir mashinada ishlagan hisob boshqasida boshqa natija berardi. IEEE 754 shu tartibsizlikni tugatdi.
Haqiqiy son ichida nima bor? #
Son uch qismga bo'linadi: ishora, tartib va mantissa.
Bir nechta sonni shu formatda yozib ko'ramiz:
| Son | Ishora | Tartib | Daraja | Mantissa |
|---|---|---|---|---|
| 1,0 | 0 | 01111111 = 127 | 0 | hammasi nol |
| 2,0 | 0 | 10000000 = 128 | 1 | hammasi nol |
| −2,0 | 1 | 10000000 = 128 | 1 | hammasi nol |
| 0,5 | 0 | 01111110 = 126 | −1 | hammasi nol |
| 0,15625 | 0 | 01111100 = 124 | −3 | 0100... |
Diqqat qiling: 2,0 va −2,0 da faqat birinchi bit
farq qiladi. Ishorani o'zgartirish uchun bitta bitni
almashtirish yetarli.
Tartib maydonidagi 127 - bu siljish. Uni ayirib, haqiqiy darajani olamiz. Shu hiyla tufayli manfiy darajalarni saqlash uchun alohida ishora biti kerak emas.
Mantissa maydonida 1,25 emas, faqat 25 qismi saqlanadi.
Oldidagi 1, yozilmaydi - u har doim bor deb
hisoblanadi.
Shu hisobga bitta bit tejaladi: 23 bit saqlanadi, lekin aniqlik 24 bitga teng.
64 bitli variantda maydonlar kattaroq:
| Ishora | Tartib | Mantissa | Siljish | |
|---|---|---|---|---|
| 32 bitli | 1 | 8 | 23 | 127 |
| 64 bitli | 1 | 11 | 52 | 1023 |
Ko'p tillarda haqiqiy son standart holatda 64 bitli bo'ladi - u ancha aniqroq.
1.0, 2.0 va -2.0 ning mantissasi bir xil - faqat ishora
va tartib farq qiladi. Bu format ilmiy yozuvning ikkilik
versiyasi: 1,25 × 10³ o'rniga 1.01 × 2³.
Maxsus qiymatlar #
IEEE 754 da oddiy sonlardan tashqari maxsus qiymatlar ham bor:
| Qiymat | Nima anglatadi | Qanday paydo bo'ladi |
|---|---|---|
+cheksizlik | juda katta son | 1e308 × 10 |
−cheksizlik | juda katta manfiy | −1e308 × 10 |
NaN | "son emas" | cheksizlik − cheksizlik |
NaN | "son emas" | 0 × cheksizlik |
−0 | manfiy nol | −1 × 0 |
NaN ning juda g'alati xossasi bor - u o'ziga ham teng
emas:
| Tekshiruv | Natija |
|---|---|
NaN = NaN | yolg'on |
NaN ≠ NaN | rost |
Bu standartning ataylab qilingan tanlovi: "noaniq qiymat" boshqa noaniq qiymat bilan teng bo'lishi mantiqsiz.
Shu sababli haqiqiy sonlarni tenglik bilan taqqoslamang. To'g'ri usul - farqning juda kichik ekanini tekshirish:
| Usul | Natija | ||
|---|---|---|---|
a = 0,3 deb tekshirish | yolg'on | ||
| ` | a − 0,3 | < 0,000000001` | rost |
NaN != NaN - bu ataylab qilinganStandart mualliflari shunday qaror qilishgan: NaN "javob
yo'q" degani, ikkita "javob yo'q" esa bir-biriga teng
bo'lishi mumkin emas.
Bu amalda kutilmagan oqibatlar beradi:
| Amal | Natija |
|---|---|
nan in [nan] | True - in avval is bilan solishtiradi |
sorted([3, nan, 1]) | Tartib buziladi |
max([1, nan, 5]) | Natija oldindan aytib bo'lmaydi |
{nan, nan} | Ikkita element bo'lishi mumkin |
Shuning uchun NaN bo'lishi mumkin bo'lgan ma'lumotni
saralashdan oldin tozalang.
Pul bilan ishlash #
0,1 ni o'n marta qo'shsak, 1,0 chiqishi kerak edi:
| Usul | Natija | 1 ga tengmi |
|---|---|---|
| Haqiqiy sonda | 0,9999999999999999 | yo'q |
| Aniq o'nlik turda | 1,0 | ha |
| Butun sonda (tiyinlarda) | 100 tiyin = 1,0 | ha |
Farq atigi 0,0000000000000001 - lekin bank hisobida bu farq millionlab amaldan keyin sezilarli bo'lib qoladi.
Shuning uchun qoida qat'iy:
| Nima uchun | Qaysi turni ishlating |
|---|---|
| Pul, hisob-kitob | Butun son (tiyinlarda) yoki aniq o'nlik tur |
| Fizika, grafika, o'lchov | Haqiqiy son mos |
| Taqqoslash | Har doim farq orqali, tenglik bilan emas |
Eng sodda va ishonchli yechim - pulni tiyinlarda butun son sifatida saqlash. Shunda hech qanday yaxlitlash xatosi bo'lmaydi.
Yuqorida farq 1,1 × 10⁻¹⁶ - juda kichik. Lekin u har
amalda qo'shiladi.
Million marta qo'shilgan hisobda xatolik allaqachon sezilarli bo'ladi. Moliyaviy tizimda bu hisobot buzilishi degani.
Amaliy qoidalar:
| Vazifa | Nima ishlatish |
|---|---|
| Pul | Butun sonda tiyin, yoki aniq o'nlik tur |
| Hisobot va jamlash | Aniq o'nlik tur |
| Grafika, o'yin, fizika | Haqiqiy son mos keladi |
| Ilmiy hisob | Haqiqiy son, lekin xatolikni baholang |
3-bo'limdagi Ariane 5 misolini eslang: u ham son turlari o'rtasidagi xatodan kelib chiqqan edi.
Aytgancha, 1991-yilda Patriot raketasi tizimi ham shunga o'xshash xatolik tufayli nishonni topa olmagan: vaqt hisoblagichdagi kichik yaxlitlash xatosi 100 soat ishlagandan keyin sezilarli siljishga aylangan.
0,1 + 0,2nima uchun0,3bermasligini o'z so'zingiz bilan yozing.- Ikkilikda aniq yoziladigan yana uchta kasr toping.
1,0sonining uch maydonini qog'ozga yozing.4,0uchun tartib maydoni qanday bo'ladi?0,25uchun daraja nechchi bo'ladi?−1,0va1,0nechta bit bilan farq qiladi?NaNnima uchun o'ziga teng emasligini tushuntiring.- Haqiqiy sonlarni to'g'ri taqqoslash usulini yozing.
- 1 000 000 marta
0,01qo'shilsa, qanday xato to'planadi? - Do'kon kassasida pulni qanday saqlash kerakligini asoslang.
Xulosa #
0.1 + 0.2 != 0.3- bu xato emas, IEEE 754 standartining tabiiy natijasi.0.1ikkilikda aniq yozilmaydi, xuddi1/3o'nlikda yozilmagani kabi.- Ikkilikda aniq yoziladiganlar - 2 ning darajalari va ularning yig'indilari.
- Haqiqiy son uch qismdan iborat: ishora, tartib (siljish bilan), mantissa.
- Formula:
(-1)^S × 1.mantissa × 2^(tartib − siljish). - 32 bitli sonda siljish 127, 64 bitli sonda 1023.
NaNo'ziga ham teng emas - uni alohida tekshiruv bilan aniqlash kerak.- Haqiqiy sonlarni tenglik bilan taqqoslamang - farqning kichikligini tekshiring.
- Xatolik har amalda to'planadi.
- Pul uchun butun sonda tiyin yoki aniq o'nlik turni ishlating.
Keyingi bo'limda matn qanday saqlanishini ko'ramiz - ASCII dan UTF-8 gacha.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.