Основы объектно-ориентированного программирования на языке 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