Десятичный тип данных
Некоторые языки программирования (или компиляторы для них) предоставляют встроенный (примитивный) или библиотечный decimal тип данных для представления неповторяющихся десятичных дробей, таких как 0,3 и -1,17, без округления, а также для выполнения арифметических действий с ними. Примерами являются decimal.Decimal
тип Python и аналогичные типы, предоставляемые другими языками.
Обоснование
[ редактировать ]Дробные числа поддерживаются большинством языков программирования как числа с плавающей запятой или числа с фиксированной запятой . Однако такие представления обычно ограничивают знаменатель степенью двойки. Большинство десятичных дробей (или большинство дробей в целом) невозможно представить в виде дроби со знаменателем, равным степени двойки. Например, простая десятичная дробь 0,3 (3/10) может быть представлена как 5404319552844595/18014398509481984 (0,2999999999999999988897769...). Эта неточность вызывает множество проблем, знакомых опытным программистам. Например, выражение 0.1 * 7 == 0.7
в некоторых системах может оказаться нелогичным из-за неточности представления десятичных дробей.
Хотя все десятичные дроби являются дробями и, следовательно, для их точного представления можно использовать рациональный тип данных , во многих ситуациях может быть удобнее рассматривать только неповторяющиеся десятичные дроби (дроби, знаменатель которых равен степени десяти). Например, дробные единицы валюты во всем мире в основном основаны на знаменателе, который представляет собой степень десяти. Кроме того, большинство дробных измерений в науке выражаются в виде десятичных дробей, в отличие от дробей с любой другой системой знаменателей.
Десятичный тип данных может быть реализован как число с плавающей запятой или как число с фиксированной запятой . В случае с фиксированной точкой знаменатель будет установлен в фиксированную степень, равную десяти. В случае с плавающей запятой переменная экспонента будет представлять степень десяти, на которую умножается мантисса числа.
Языки, поддерживающие рациональный тип данных, обычно позволяют создавать такое значение из двух целых чисел вместо числа с плавающей запятой по основанию 2 из-за потери точности, которую может вызвать последнее. Обычно базовые арифметические операции ('+', '-', '×', '/', целочисленные степени ) и сравнения ('=', '<', '>', '≤') расширяются для работы с их — либо изначально, либо с помощью средств перегрузки операторов, предоставляемых языком. Эти операции могут быть преобразованы компилятором в последовательность целочисленных машинных инструкций или в вызовы библиотеки . Поддержка также может распространяться на другие операции, такие как форматирование, округление до целого числа или значения с плавающей запятой и т. д. Примером этого является 123.456.
Стандартные форматы
[ редактировать ]IEEE 754 определяет три стандартных десятичных типа данных с плавающей запятой разной точности:
- Decimal32 формат с плавающей запятой
- Decimal64 формат с плавающей запятой
- Десятичный формат с плавающей запятой128
Языковая поддержка
[ редактировать ]- C# имеет встроенный тип данных «десятичный», состоящий из 128 бит, что дает 28–29 значащих цифр. Он имеет приблизительный диапазон от (-7,9 × 10 ^ 28 до 7,9 × 10 ^ 28) / (10 ^ (от 0 до 28)). [1]
- Начиная с Python 2.4, себя стандартная библиотека Python включает в Десятичный класс в модуле десятичный . [2]
- Ruby включает в себя Стандартная библиотека Класс BigDecimal в модуле большой десятичный .
- Java Стандартная библиотека включает класс java.math.BigDecimal .
- В Objective-C API -интерфейсы Cocoa и GNUstep предоставляют класс NSDecimalNumber и тип данных NSDecimal C для представления десятичных чисел, мантисса которых имеет длину до 38 цифр и показатель степени от -128 до 127.
- Некоторые системы IBM и системы SQL поддерживают формат DECFLOAT, по крайней мере, с двумя более крупными форматами. [3]
- Новый тип данных ABAP DECFLOAT включает форматы decimal64 (как DECFLOAT16) и decimal128 (как DECFLOAT34). [4]
- PL/I изначально поддерживает десятичные данные как с фиксированной, так и с плавающей запятой.
- GNU Compiler Collection (gcc) обеспечивает поддержку десятичных чисел с плавающей точкой как расширение C и C++. [5]
См. также
[ редактировать ]- Арифметика произвольной точности
- Арифметика с плавающей запятой
- Устранение ошибок с плавающей запятой
Ссылки
[ редактировать ]- ^ «Числовые типы с плавающей запятой — справочник по C#» .
- ^ «Десятичное число — десятичная арифметика с фиксированной запятой и плавающей запятой — документация Python 3.10.0» .
- ^ «Управление данными» . ИБМ .
- ^ «Как новый тип данных ABAP DECFLOAT помогает выполнять сложные вычисления? «SAP Ignite» . Архивировано из оригинала 9 августа 2012 г. Проверено 28 июля 2012 г.
- ^ «Руководство GCC» . 6.13. Десятичные типы с плавающей запятой.