Skip to content

Kompyuterlar sonlarda adashadimi?

Chop etilgan: at 10:54

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 ni false 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:

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.


Oldingi maqola
ZehnBot – bilim olishda yangi davr boshlanishi!
Keyingi maqola
Ko‘proq so‘rang – ko‘proq olasiz!