и не понял сути
Через float нельзя точно представить все дробные числа
скажем, можно представить только некоторые вещественные числа точно из несчетного множества вещественных чисел
Потому что 0.3 нельзя представить как сумму степеней двойки
Есть ответ. Но он тебе не понравится.
Примерно по той же причине, почему 1/3 записывается как 0,33...333...
есть - плавающая точка
Да, 0.1 и 0.2 в двоичной системе бесконечные периодические дроби (а у тебя все в двоичной системе в компудахтере) поэтому при сложении получаешь бесконечную двоичная дробь что в десятичной неправильно аппроксимируется, а вообще читай про IEEE 754
0.1 это 10^-1 = 5^-1 * 2^-1 = 1/5 * 2^-1 0.2 это 2*10^-1 = 2*5^-1 * 2^-1 = 2/5 * 2^-1 0.3 это 3*10^-1 = 3*5^-1 * 2^-1 = 3/5 * 2^-1 для 0.1 и 0.2 потребуется нормализация мантиссы - то есть 0.1 = 4/5 * 2^-3 0.2 = 4/5 * 2^-2, то есть мантиссы одинаковые, а показатели отличаются на 1, при этом мантисса 0.1 потеряла 2 бита точности, а 0.2 - один бит, при вычитании 0.2 - 0.1 - показатели уравняются, сдвинув мантиссу 0.1 обратно на 1 бит, результат будет 2/5 * 2^-2, для него снова требуется нормализация мантиссы - 4/5 * 2^-3, при сдвиге теряется точность 1 бит, у 0.3 нормализация мантиссы не требуется - 0.3 - 0.2 = 3/5 * 2^-1 - 4/5 * 2^-2 = 1/5 * 2^-1, для нормализации мантиссы потребуется сдвиг на 2 бита 4/5 * 2^-3 Итого - для результата 0.3-0.2 потеряется 2 бита точности мантиссы, а для 0.2-0.1 - один бит, результаты - разные числа, одно совпадает с представлением 0.1, другое - нет https://www.youtube.com/channel/UCe_TcJarfs-HKy3NySy8Kng/community?lc=UgxcMNqlfTBp1429Mdt4AaABAg&lb=Ugw0tueWuyoK9zPnyvF4AaABCQ тут вот тема поднималась)
короче - это из за нормализации мантиссы
https://intuit.ru/studies/courses/3657/899/lecture/32458
Обсуждают сегодня