Десятковий тип даних
Мови програмування (або компілятори для них) частіше за все надають вбудований (примітивний) або бібліотечний десятковий тип даних для представлення неповторюваних десяткових дробів, таких як 0.3 або -1.17, без округлення, і для виконання арифметики з ними. Прикладом є тип decimal.
Decimal
мови Python і аналогічні типи інших мов програмування .
Обґрунтування
ред.Дробові числа підтримуються більшістю мов програмування як числа з плаваючою або фіксованою комою. Однак такі представлення зазвичай обмежують знаменник ступенем двійки. Більшість десяткових дробів (або більшість дробів загалом) не можна точно представити як дріб зі знаменником, який є ступенем двійки.
Наприклад, простий десятковий дріб 0.3 (3/10) може бути представлений як 5404319552844595/18014398509481984 (0,299999999999999988897769. . . ). Ця неточність викликає багато проблем, знайомих досвідченим програмістам. Наприклад, вираз 0.1 * 7 == 0.7
може суперечливо мати значення false у деяких системах через неточність подання десяткових знаків.
Хоча всі десяткові дроби є дробами, і, відтак, можна використовувати раціональний тип даних для їх точного представлення, у багатьох випадках може бути зручніше розглядати лише неперіодичні десяткові дроби (дроби, знаменник яких є ступенем десяти). Наприклад, дробові одиниці валюти в усьому світі здебільшого базуються на знаменнику, який є ступенем числа десять. Також більшість дробових вимірювань у науці повідомляється як десяткові дроби, на відміну від дробів з будь-якою іншою системою знаменників.
Десятковий тип даних може бути реалізований одним способом:
- число з рухомою комою (змінний показник степеня представлятиме собою ступінь десяти, на який множиться мантиса числа)
- число з фіксованою комою (знаменник буде встановлений у фіксованому ступені десяти)
Мови програмування, які підтримують раціональний тип даних, зазвичай дозволяють конструювати таке значення з двох цілих чисел, замість числа з плаваючою комою з основою 2, через втрату точності, яку б останнє спричинило. Зазвичай базові арифметичні операції ('+', ' − ', '×', '/', зведення цілих в ступінь ) і порівняння ('=', ' < ', ' > ', '≤') розширюються, щоб діяти на їх — або нативно, або через засоби перевантаження оператора, надані мовою програмування. Ці операції можуть бути переведені компілятором у послідовність цілочисельних машинних інструкцій або у виклики бібліотеки .
Стандартні формати
ред.IEEE 754 визначає три стандартні типи десяткових даних із плаваючою комою різної точності:
- Формат числа з плаваючою комою Decimal32
- Формат числа з плаваючою комою Decimal64
- Формат числа з плаваючою комою Decimal128
Підтримка мовами програмування
ред.- C# має вбудований тип даних "decimal", що складається з 128-біт, що призводить до 28-29 значущих цифр. Він має приблизний діапазон (-7.9 x 10^28 до 7.9 x 10^28) / (10^(0 .. 28)). [1]
- Починаючи з Python 2.4, стандартна бібліотека Python включає клас Decimal в модулі decimal . [2]
- Стандартна бібліотека Ruby включає клас BigDecimal в модулі bigdecimal .
- Стандартна бібліотека Java включає клас java.math.BigDecimal .
- У мові Objective-C API Cocoa та API GNUstep надають клас NSDecimalNumber і тип даних NSDecimal для представлення десяткових дробів, мантиса яких має довжину до 38 цифр, а експонента становить від -128 до 127.
- Деякі системи IBM і системи SQL підтримують формат DECFLOAT принаймні з двома більшими форматами. [3]
- У ABAP новий тип даних DECFLOAT включає формати decimal64 (як DECFLOAT16) і decimal128 (як DECFLOAT34). [4]
- PL/I оригінально підтримує десяткові дані як з фіксованою, так і з плаваючою комою.
- Колекція компіляторів GNU (gcc) забезпечує підтримку десяткових чисел з плаваючою точкою як розширення. [5]
Дивись також
ред.Посилання
ред.- ↑ Floating-point numeric types - C# reference.
- ↑ Decimal — Decimal fixed point and floating point arithmetic — Python 3.10.0 documentation.
- ↑ Data management. IBM.
- ↑ How the new ABAP Data Type DECFLOAT helps computing complex calculation? « SAP Ignite. Архів оригіналу за 9 серпня 2012. Процитовано 28 липня 2012.
- ↑ GCC Manual. 6.13 Decimal Floating Types.