Forwarded from Shukhrat Utaboev | Blog
To'g'ri javob yo'q, if ichidagi kod ishlamaydi.
Bunga asosiy sabab barcha dasturlash tillarida hisob kitoblar binary holatda amalga oshiriladi. Masalan 6 soni 110 (ya'ni 0*2^0 + 1*2^1 + 1*2^2) ko'rinishida bo'ladi va shu ko'rinishdaligida ustida amallar bajariladi.
Yuqoridagi holatni endi ko'rib chiqamiz. Decimal sonlarni binary ko'rinishga o'tkazish unchalik ham murakkab emas. Buni google orqali tezda tushinib olishingiz mumkin.
0.2 = 0.00110011001100110011...
0.3 = 0.01001100110011001100...
Ikkala chiqqan binary sonlarni qo'shamiz.
0.00110011001100110011...
+ 0.01001100110011001100...
= 0.01111111111111111111...
0.5 ni ham binaryga o'tkazsak 0.1 qiymat olamiz.
0.1 > 0.01111111111111111111... .
Ko'rib turganimizdek 0.5 ning qiymati 0.2 + 0.3 nikidan juda kam miqdorda katta.
Orqaga qaytamiz. 0.1 ni decimalga o'zgartiramiz 0*2^0 + 1*2^-1 = 0.5.
0.011111111111111... ni qaytarsak 0*2^0 + 0*2^-1 + 1*2^-2 + 1*2^-3 + 1*2^-4 + 1*2^-5 + ... - "natija"si 0.5 ga teng cheksiz kamayuvchi geometrik progressiya. Kompyuterda esa cheksiz degan tushuncha yo'q, o'zgaruvchiga hotirada qancha joy ajratilgan bo'lsa shuncha aniqlikda hisoblaydi. Misol tariqasida verguldan keyingi 20ta raqam hotiraga sig'di deb hisoblasak 0.01111111111111111111 ni decimalga aylantiramiz, natija esa 0.499999046 chiqadi (aslida bundan ancha aniq ishlaydi).
0.5 β 0.499999046
Bu holat floating point error deb ataladi.
Shu yergacha kelgan bo'lsangiz yana bitta savol 0.2 + 0.3 == 0.1 + 0.4 ning natijasi nima bo'ladi?
#math
@shukhratutaboev
Bunga asosiy sabab barcha dasturlash tillarida hisob kitoblar binary holatda amalga oshiriladi. Masalan 6 soni 110 (ya'ni 0*2^0 + 1*2^1 + 1*2^2) ko'rinishida bo'ladi va shu ko'rinishdaligida ustida amallar bajariladi.
Yuqoridagi holatni endi ko'rib chiqamiz. Decimal sonlarni binary ko'rinishga o'tkazish unchalik ham murakkab emas. Buni google orqali tezda tushinib olishingiz mumkin.
0.2 = 0.00110011001100110011...
0.3 = 0.01001100110011001100...
Ikkala chiqqan binary sonlarni qo'shamiz.
0.00110011001100110011...
+ 0.01001100110011001100...
= 0.01111111111111111111...
0.5 ni ham binaryga o'tkazsak 0.1 qiymat olamiz.
0.1 > 0.01111111111111111111... .
Ko'rib turganimizdek 0.5 ning qiymati 0.2 + 0.3 nikidan juda kam miqdorda katta.
Orqaga qaytamiz. 0.1 ni decimalga o'zgartiramiz 0*2^0 + 1*2^-1 = 0.5.
0.011111111111111... ni qaytarsak 0*2^0 + 0*2^-1 + 1*2^-2 + 1*2^-3 + 1*2^-4 + 1*2^-5 + ... - "natija"si 0.5 ga teng cheksiz kamayuvchi geometrik progressiya. Kompyuterda esa cheksiz degan tushuncha yo'q, o'zgaruvchiga hotirada qancha joy ajratilgan bo'lsa shuncha aniqlikda hisoblaydi. Misol tariqasida verguldan keyingi 20ta raqam hotiraga sig'di deb hisoblasak 0.01111111111111111111 ni decimalga aylantiramiz, natija esa 0.499999046 chiqadi (aslida bundan ancha aniq ishlaydi).
0.5 β 0.499999046
Bu holat floating point error deb ataladi.
Shu yergacha kelgan bo'lsangiz yana bitta savol 0.2 + 0.3 == 0.1 + 0.4 ning natijasi nima bo'ladi?
#math
@shukhratutaboev