Основы объектно-ориентированного программирования на языке C# book | Page 104

6 Зображення чисел у комп’ ютерi
Двiйковi дроби теж можуть бути нескiнченними. Бiльше того, не кожне число, що виражається скiнченним десятковим дробом, може бути також зображено скiнченним двiйковим. Наприклад, число 1 / 5 зображується скiнченним десятковим дробом як 0.2, але воно не може бути виражене скiнченним двiйковим дробом. Такi дроби завжди перiодичнi, оскiльки рацiональне число зображується скiнченним або перiодичним дробом у системi числення з будь-якою основою. Розглянемо кiлька прикладiв некоректного використання дiйсних типiв. 1. Приклад появи зайвих цифр.
using System; class Program { static void Main() { float r; r = 0.1f; Console. WriteLine("{ 0: E8 }", r);
}
}
Пiсля виконання програми ми побачимо 1.00000001e-001. Точнiсть типу float – 7 – 8 десяткових розрядiв, так що результат правильний. Однак звiдки взялися iншi цифри?
Виявляється, число 0.1 не зображується у виглядi скiнченного двiйкового дробу, воно дорiвнює 0.0( 0011). I цей нескiнченний двiйковий дрiб округляється на 24 знаках; ми одержуємо не 0.1, а деяке наближене число. Проекспериментувавши з рiзними числами, можна помiтити, що точно зображуються тi числа, що виражаються у виглядi m / 2 n, де m, n – деякi цiлi числа.
2. Приклад незрозумiлого результату виконання програми.
using System; class Program { static void Main() { float r; r =( float) 0.1; if( r == 0.1)
Console. WriteLine(" equal "); else
Console. WriteLine(" not equal ");
}
}
Пiсля запуску програми ми отримаємо“ not equal”. Змiнна r при присвоюваннi одержує значення 0.100000001, тому що значення 0.1 має тип double, а потiм, при присвоюваннi, вiдбувається округлення до типу float. Лiва, i права частини рiвностi в умовi спочатку
104