Чому Float виділили в окремий клас? Існує Integer

У Ruby, як і в багатьох інших мовах програмування, типи даних [Float](https://rubydevelopers.org/t/float-ruby/521) і [Integer](https://rubydevelopers.org/t/integer-ruby/520) виділені в окремі класи з кількох важливих причин:

1. Різні області застосування

Integer представляє цілі числа, які використовуються в багатьох контекстах, де дробові значення не потрібні, наприклад, для лічильників, індексів масивів і дискретних значень.

Float представляє числа з плаваючою комою, які необхідні для представлення значень з дробовою частиною, таких як вимірювання, фінансові розрахунки, наукові обчислення тощо.

2. Відмінності в реалізації

Цілі числа (Integer) і числа з плаваючою комою (Float) зберігаються і обробляються по-різному на рівні апаратного забезпечення і в пам’яті комп’ютера:

  • Integer: Цілі числа зберігаються у форматі двійкового цілого числа, що дозволяє точно представляти будь-яке ціле значення в межах обмежень розрядності системи. Вони ефективні для операцій над цілими числами, таких як додавання, віднімання, множення і ділення без залишку.

  • Float: Числа з плаваючою комою зберігаються у форматі IEEE 754, який включає мантису і експоненту. Цей формат дозволяє представляти дуже великі і дуже маленькі числа, а також дробові значення, але з обмеженою точністю. Операції над числами з плаваючою комою, такі як додавання, віднімання, множення і ділення, можуть мати невеликі похибки через обмежену точність.

3. Відмінності в поведінці

Цілі числа і числа з плаваючою комою мають різну поведінку, коли мова йде про математичні операції, округлення, точність та обробку виключних ситуацій:

  • Операції: Операції з цілими числами завжди точні і не мають помилок округлення. Операції з числами з плаваючою комою можуть мати похибки через округлення.

  • Точність: Цілі числа можуть бути представлені точно, тоді як числа з плаваючою комою мають обмежену точність і можуть втрачати частину інформації.

  • Обробка виключень: Числа з плаваючою комою можуть мати спеціальні значення, такі як NaN (Not a Number) і Infinity, які використовуються для обробки виключень і помилок у математичних операціях.

4. Полегшення розробки та підтримки коду

Поділ на окремі класи дозволяє чітко визначити, який тип чисел використовується, і відповідно до цього розробляти та оптимізувати алгоритми. Це також дозволяє забезпечити більш зрозумілу і чітку семантику коду, полегшуючи його читання, написання і підтримку.

5. Розширення і специфічні методи

Окремі класи дозволяють додавати специфічні методи і функціональність, які мають сенс тільки для даного типу чисел. Наприклад, методи округлення, перевірки на кінцевість або нескінченність, специфічні математичні операції тощо, які мають сенс тільки для чисел з плаваючою комою.

Висновок

Розділення числових типів на Integer і Float в Ruby обґрунтоване їх різними властивостями, поведінкою і областями застосування. Це забезпечує ефективне і точне представлення чисел, відповідні математичні операції та полегшує розробку та підтримку коду.