Nega 0.1 + 0.2 === 0.3
emas? — kompyuterlar sonlarda adashadimi?
Kompyuterlar har doim aniq ishlaydi deyishadi. Ammo siz
0.1 + 0.2 === 0.3
nifalse
deb ko‘rsangiz, bu ishonch bir oz titraydi. Bugun shu “matematik xatolik” ortidagi sehrni ochamiz.
Sehr emas, bu — Floating Point!
Kompyuterlar sonlarni ikki lik (binary) tizimda saqlaydi. Ya’ni ular faqat 0
va 1
larni tushunadi. Bu raqamlar IEEE 754 deb ataladigan standartga ko‘ra saqlanadi.
Bu standart floating point (ya’ni suzuvchi nuqtali) formatni ishlatadi — bu sonlarni yaqinlashtirib ifodalashga asoslangan. Bu nima degani?
Oddiy qilib aytganda: kompyuterlar ba’zi onlik kasrlarni aniq saqlay olmaydi. Aynan 0.1
va 0.2
kabi sonlar binary sistemada tugamaydi, ya’ni cheksiz ketma-ketlik bo‘lib chiqadi.
Tushunarliroq qilish uchun misol:
Quyidagicha sinab ko‘ring:
console.log(0.1 + 0.2); // 0.30000000000000004
Kompyuter 0.1
va 0.2
ni eng yaqin mumkin bo‘lgan binary qiymatlarda saqlaydi. Ularni qo‘shganda esa 0.3 emas, 0.30000000000000004 hosil bo‘ladi.
Shuning uchun:
console.log(0.1 + 0.2 === 0.3); // false
Qanday qilib bu muammodan qochish mumkin?
Agar siz floating point sonlar bilan ishlayotgan bo‘lsangiz, aniq tenglik (===
) o‘rniga epsilon (yaqinlik) usulini ishlating:
const isEqual = Math.abs((0.1 + 0.2) - 0.3) < Number.EPSILON;
console.log(isEqual); // true
Bu yerda Number.EPSILON
— kompyuterda ifodalanadigan eng kichik farq. Agar ikkita son orasidagi farq undan kichik bo‘lsa, ular “teng” deb qabul qilinadi.
Haqiqiy hayotdagi analogiya
Tasavvur qiling, sizda 0.1 litr, 0.2 litr va 0.3 litr suvni o‘lchash uchun ko‘zdan kechgan, ozgina noto‘g‘ri ishlaydigan idishlaringiz bor. Ular deyarli to‘g‘ri, lekin juda ozgina xatolik bor. Suvni qo‘shganingizda umumiy miqdor 0.30000000004 litr chiqadi — nazariy jihatdan bu 0.3 emas, lekin amaliyotda “deyarli” o‘sha narsa.
Kompyuter ham xuddi shunday ishlaydi. U sonlar bilan “deyarli to‘g‘ri” ishlaydi, lekin mikroskopik xatoliklar mavjud.
Xulosa
Dasturlash tillaridagi 0.1 + 0.2 !== 0.3
muammosi:
- Kompyuterlarning sonlarni ikkilikda saqlashi bilan bog‘liq
- Floating point yaqinlashtirishlar sababli yuzaga chiqadi
- Bu “xatolik” emas, balki dizayn tanlovi
- Muammo emas, ogohlantiruvchi bilim sifatida qabul qilish kerak
Agar siz hali ham bu muammo nimaga kerak deb o‘ylayotgan bo‘lsangiz, esda tuting: kompyuterlar matematik emas, fizik qurilmalar. Ular sonlarni ifodalashda cheklovlarga ega — va biz bu bilan yashashni o‘rganamiz.