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

6.8 Керування машинним зображенням чисел та особливостi виконання арифмет перетворюються на тип double , i лише потiм здiйснюється порiвня- ння. Число, що зберiгається в змiннiй r (уже не 0.1!), зображується у виглядi скiнченного двiйкового дробу. При перетвореннi цього чи- сла в double молодшi, надлишковi, порiвняно з типом float , розряди мантиси, просто заповнюються нулями. Ми одержуємо те саме число, тiльки записане у форматi double . Над числом 0.1 iз правоı̈ частини не вiдбувається промiжного пере- творення в float i воно матиме нескiнченне зображення у двiйковому кодi, а деякi з молодших розрядiв мантиси мiститимуть ненульовi значення. Тому порiвнюють близькi, але не рiвнi числа. Якщо замiнити число 0.1 на 0.5, то одержимо “equal”, тому що 0.5 – це скiнченний двiйковий дрiб. При прямому зведеннi його до типу float у молодших розрядах будуть нулi. Такi самi нулi виявляються в цих розрядах при перетвореннi числа 0.5 типу float у тип double . Тому в результатi ми порiвнюємо два однакових числа. 3. Розглянемо програму: using System; class Program { static void Main() { float r1; double r2; r1 = (float)0.1; r2 = 0.1; if (r1 == r2) Console.WriteLine("equal"); else Console.WriteLine("not equal"); } } Одержимо такий самий результат, тобто “not equal”, iз тих самих причин. 4. Розглянемо програму: using System; class Program { static void Main() { float r; int i; r = 1; for (i = 1; i <= 10; i++) r -= 0.1f; Console.WriteLine("r={0}", r); } } 105