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.

🕑 9 daqiqa o‘qish 📄 1 239 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Sabab: ikkilikda aniq yozilmaydi
  2. Haqiqiy son ichida nima bor?
  3. Maxsus qiymatlar
  4. Pul bilan ishlash
  5. Xulosa

Har bir dasturchi bir kun shu savolga duch keladi:

Natija
>>> 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:

AmalNatija
0,1 + 0,20,30000000000000004
0,3 ga tengmiyo'q

Bu xato emas. Sabab shundaki, bu sonlar ikkilikda aniq yozilmaydi. Kompyuter ularni shunday saqlaydi:

YozganingizAslida saqlangani
0,10,1000000000000000055511151231257827...
0,20,2000000000000000111022302462515654...
yig'indi0,3000000000000000444089209850062616...
0,30,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:

KasrQaysi sistemada aniq yozilmaydi
1/3o'nlikda: 0,3333...
1/10ikkilikda: 0,000110011...

Ikkilikda aniq yoziladigan kasrlar - bu 2 ning darajalari:

SonAniq saqlanadimi
0,5ha
0,25ha
0,75ha
0,125ha
2,5ha
0,1yo'q

Mana asosiy nuqta: kompyuter 0.1 ni saqlamaydi. U 0.1000000000000000055511... ni saqlaydi - eng yaqin ifodalanadigan son.

Bu biror dasturning kamchiligi emas

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.

IEEE 754 - 32 bitli haqiqiy son S TARTIB MANTISSA 1 bit 8 bit 23 bit ishora daraja aniqlik raqamlari 31 0 qiymat = (-1)^S × 1,mantissa × 2^(tartib - 127) Misol: 0,15625 soni 0 01111100 01000000000000000000000 musbat 124 - 127 = -3 1,25 Hisoblaymiz 1,25 × 2^(-3) = 1,25 × 0,125 = 0,15625 Tartibga 127 qo'shilishi "siljish" deb ataladi - manfiy darajalar uchun
Uchta maydon: ishora, daraja va aniqlik raqamlari

Bir nechta sonni shu formatda yozib ko'ramiz:

SonIshoraTartibDarajaMantissa
1,0001111111 = 1270hammasi nol
2,0010000000 = 1281hammasi nol
−2,0110000000 = 1281hammasi nol
0,5001111110 = 126−1hammasi nol
0,15625001111100 = 124−30100...

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.

Mantissadagi yashirin bir

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:

IshoraTartibMantissaSiljish
32 bitli1823127
64 bitli111521023

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:

QiymatNima anglatadiQanday paydo bo'ladi
+cheksizlikjuda katta son1e308 × 10
−cheksizlikjuda katta manfiy−1e308 × 10
NaN"son emas"cheksizlik − cheksizlik
NaN"son emas"0 × cheksizlik
−0manfiy nol−1 × 0

NaN ning juda g'alati xossasi bor - u o'ziga ham teng emas:

TekshiruvNatija
NaN = NaNyolg'on
NaN ≠ NaNrost

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:

UsulNatija
a = 0,3 deb tekshirishyolg'on
`a − 0,3< 0,000000001`rost
NaN != NaN - bu ataylab qilingan

Standart 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:

AmalNatija
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:

UsulNatija1 ga tengmi
Haqiqiy sonda0,9999999999999999yo'q
Aniq o'nlik turda1,0ha
Butun sonda (tiyinlarda)100 tiyin = 1,0ha

Farq atigi 0,0000000000000001 - lekin bank hisobida bu farq millionlab amaldan keyin sezilarli bo'lib qoladi.

Shuning uchun qoida qat'iy:

Nima uchunQaysi turni ishlating
Pul, hisob-kitobButun son (tiyinlarda) yoki aniq o'nlik tur
Fizika, grafika, o'lchovHaqiqiy son mos
TaqqoslashHar doim farq orqali, tenglik bilan emas

Eng sodda va ishonchli yechim - pulni tiyinlarda butun son sifatida saqlash. Shunda hech qanday yaxlitlash xatosi bo'lmaydi.

Xatolik to'planadi

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:

VazifaNima ishlatish
PulButun sonda tiyin, yoki aniq o'nlik tur
Hisobot va jamlashAniq o'nlik tur
Grafika, o'yin, fizikaHaqiqiy son mos keladi
Ilmiy hisobHaqiqiy 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.

Amaliy topshiriq
  1. 0,1 + 0,2 nima uchun 0,3 bermasligini o'z so'zingiz bilan yozing.
  2. Ikkilikda aniq yoziladigan yana uchta kasr toping.
  3. 1,0 sonining uch maydonini qog'ozga yozing.
  4. 4,0 uchun tartib maydoni qanday bo'ladi?
  5. 0,25 uchun daraja nechchi bo'ladi?
  6. −1,0 va 1,0 nechta bit bilan farq qiladi?
  7. NaN nima uchun o'ziga teng emasligini tushuntiring.
  8. Haqiqiy sonlarni to'g'ri taqqoslash usulini yozing.
  9. 1 000 000 marta 0,01 qo'shilsa, qanday xato to'planadi?
  10. Do'kon kassasida pulni qanday saqlash kerakligini asoslang.

Xulosa #

  • 0.1 + 0.2 != 0.3 - bu xato emas, IEEE 754 standartining tabiiy natijasi.
  • 0.1 ikkilikda aniq yozilmaydi, xuddi 1/3 o'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.
  • NaN o'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.

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.