Десятичное число с плавающей запятой () — является десятичным типом данных в формате плавающей запятой.

Работа непосредственно с десятичным типами позволяет избежать ошибок округления цифр, которые обычно возникают при преобразовании между десятичными дробями (обычными для вводимых человеком данных, таких как результаты измерений или финансовая информация) и двоичными дробями.

Преимущество представления с плавающей запятой перед представлением с фиксированной запятой состоит в том, что оно поддерживает гораздо более широкий диапазон значений. Например, в то время как представление с фиксированной запятой, которое выделяет 8 десятичных цифр и 2 десятичных разряда, может представлять числа:

представление с плавающей запятой с 8 десятичными цифрами также может представлять:

и так далее. Этот более широкий диапазон можно использовать для значительного замедления накопления ошибок округления при последовательных вычислениях. Например, алгоритм компенсационного суммирования Ноймайера, Бабушка, Кэхэна можно использовать для снижения накопления ошибок округления при сложении большого количества чисел с плавающей запятой.

Аппаратные реализации К ранним механическим устройствам, использующим десятичную арифметику с плавающей запятой, относятся абак, логарифмическая линейка, калькулятор Смоллвуда и некоторые другие калькуляторы, поддерживающие экспоненциальную запись. В случае механических калькуляторов показатель степени часто рассматривается как дополнительная информация, которая учитывается отдельно.

Компьютер IBM 650 поддерживал восьмизначный десятичный формат с плавающей запятой в 1953 году. Бинарная машина Wang VS поддерживала 64-битный десятичный формат с плавающей запятой в 1977 году. Motorola 68881 поддерживала формат с 17 цифрами мантиссы и 3 цифрами порядка в 1984 году, а в 1990-м библиотека поддержки чисел с плавающей запятой для процессора Motorola 68040 обеспечила совместимость с 96-битным десятичным форматом с плавающей запятой.

IBM POWER6 и более новые процессоры POWER имеют аппаратную поддержку DPD, как и IBM System z9 (и более поздние компьютеры серии z). Fujitsu также выпускает 64-битные SPARC процессоры с аппаратной поддержкой DPD.

Программная поддержка

НазваниеЯзыкиОбъём поддержкиЦПОСФорматПримечанияBSONdecimal128BIDПрограммнаяEcma TC39 JavaScript Decimal proposalJSDecimal128Без ввода/выводаGNU (gcc)СС++Только типы:_Decimal32_Decimal64_Decimal128POWERAIXLinuxDPDПрограммнаяAArch64i386x86_64LinuxMINGWBIDПрограммнаяFreeBSDmacOSBID/DPDОтключена по умолчаниюПрограммнаяIntel classic (icc)СС++Частично:ISO/IEC TR 24732:2009x86_64LinuxmacOSWindowsBIDПрограммнаяIntelLLVM (icx)СС++Нет поддержкиIntelRDFPMathLibСС++BID64BID128i386x86_64HP-UXLinuxmacOSSolarisWindowsBIDПрограммнаяJDKJavaDECIMAL32DECIMAL64DECIMAL128Только режимы округления BigDecimal, основан на BigIntegermpdecimal (libmpdec)СС++LuaPHPPythonMPD_DECIMAL32MPD_DECIMAL64MPD_DECIMAL128Программная, размер псевдоцифры 1019libdfpСС++Частично:ISO/IEC TS 18661-2:2015ISO/IEC TR 24733:2011POWERAIXLinuxDPDДополнительно реализует аппаратную поддержку для GNU gccx86_64LinuxBIDПрограммнаяPython decimalPythondecimal.IEEEContext(bits)ПрограммнаяТолько режимы округления, основан на mpdecimalXL (IBM XL, xlc)СС++ISO/IEC TR 24732:2009POWERAIXLinuxDPDАппаратнаяXLClang (IBM Clang-based XL, xlclang)СС++Нет поддержки

Стандарты на десятичные числа с плавающей запятой Действующие: СтандартЯзыкОписаниеISO/IEC 60559:2020Определяет операции и форматы обмена, так же известен как IEEE 754—2019ISO/IEC 9075:2016 (SQL:2016)SQLОпределяет тип DECFLOATISO/IEC 9899:2024 (С23)СОпределяет типы и интерфейсы функцийISO/IEC TR 24733:2011C++Технический отчёт (предложение) определения классов и методовEcma TC39 JavaScript Decimal proposalJSПредложение по классам и операциям, в процессе рассмотренияIBM’s General Decimal Arithmetic SpecificationОпределяет операции

Исторические: СтандартЯзыкОписаниеIEEE 854—1985Определяет операцииISO/IEC 60559:2011Определяет операции и форматы обмена, так же известен как IEEE 754—2008ISO/IEC TR 24732:2009СТехнический отчёт (предложение) определения типов и интерфейсы функцийISO/IEC TS 18661-2:2015СТехнические спецификации (предложения) определений типов и интерфейсов функций

Стандартные форматы обмена информацией Стандарт ISO/IEC 60559 определяет три основных типа данных десятичных чисел с плавающей запятой: decimal32, decimal64, decimal128, и два формата их представления: двоичное кодирование () десятичных чисел с плавающей точкой и их десятичное кодирование (). Оба формата обеспечивают одинаковый диапазон представимых значений и идентичны во всех операциях, кроме преобразования формата.

Стандарт определяет DPD (), как способ декодирования 10-бит деклетов в три десятичные цифры, но часто (Fujitsu, GNU, IBM и другие) эту аббревиатуру используют, как обозначение десятичного кодирования десятичных чисел с плавающей точкой. Так же, часто используемой аббревиатурой двоичного кодирования (GNU, Intel и другие) является BID ().

Когорты Десятичные числа ISO/IEC 60559 не являются нормализованными, число может иметь несколько представлений. Набор представлений, которым соответствует число с плавающей запятой, называется когортой чисел с плавающей запятой. Члены когорты являются различными представлениями одного и того же числа с плавающей запятой.

Несмотря на численное равенство, члены когорты могут быть различимы с помощью операций, специфичных для десятичной системы счисления. Десятичные приложения могут использовать дополнительную информацию, предоставляемую когортами.

Числа 0. и -0. являются разными числами, результаты операций (деление, copySign и др.) для них отличаются, поэтому они образуют две различные когорты.

Кодирование Десятичное число с плавающей запятой состоит из:

Знака; Cмещённой экспоненты: ; Мантиссы: .

И кодируется тремя полями:

Поле знака; Комбинированное поле, содержит смещённую экспоненту, признаки NaN, ∞ и старшую цифру (или старшие 4 бит) мантиссы; Поле младших знаков (бит) мантиссы.

, где параметры J, p, t и w выбираются согласно п. 3.5.2 ISO/IEC 60559 исходя из числа бит формата (k). 1 битMSB битLSBMSB битLSBS(знак)G(комбинированное поле)T(младшие знаки мантиссы)DPD: J деклет или цифрBID: t бит или число Числа ±∞ кодируются одинаково, и в двоичном, и в десятичном способе кодирования.

Числа ±NaN и ±sNaN, строго говоря, кодируются различным образом, но в стандарте есть оговорка, что декодер DPD должен декодировать все 1024 деклета, а не только 1000 канонических. Таким образом NaN остаётся NaN-ом, вне зависимости от способа кодирования, но его идентификатор может измениться. +Форматы десятичных чисел с плавающей запятой ISO/IEC 60559decimal32decimal64decimal128decimal(32k)Параметры1111Поле знака [бит]5555Комбинатор [бит]6812Младшие биты экспоненты [бит]2050110Младшая часть мантиссы [бит]3264128Общий размер [бит]71634Разрядность мантиссы [цифры]19276812288Диапазон экспоненты963846144Максимальное значение 9.99…×10Emax−95−383−6143Минимальное нормализованное значение 10Emin−101−398−6176Минимальное ненулевое 10Etiny

Двоичное кодирование, BID При двоичном кодировании старшие 4 бита мантиссы не превышают 1001 (или 9), используется два варианта кодирования, для 0mmm, и для 100m.

Комбинированное полеСмещённая экспонентаМантисса00eee...emmm00eee...e0mmmtttt..t01eee...emmm01eee...e0mmmtttt..t10eee...emmm10eee...e0mmmtttt..t1100eee...em00eee...e100mtttt..t1101eee...em01eee...e100mtttt..t1110eee...em10eee...e100mtttt..t11110xx...xxнеприменимонеприменимо∞111110x...xxнеприменимоtttt..tNaN, младшие битымантиссы — его идентификатор111111x...xxнеприменимоtttt..tСигнальный sNaN, младшие битымантиссы — его идентификатор

Десятичное кодирование, DPD При десятичном кодировании, аналогично, используются два варианта, для старшего знака мантиссы , и для , но с иным порядком бит. Комбинированное полеСмещённая экспонентаМантисса00ddde...eee00e...eee[0ddd][declet]...01ddde...eee01e...eee[0ddd][declet]...10ddde...eee10e...eee[0ddd][declet]...1100de...eee00e...eee[100d][declet]...1101de...eee01e...eee[100d][declet]...1110de...eee10e...eee[100d][declet]...11110xx...xxнеприменимонеприменимо∞111110x...xxнеприменимо[declet]...NaN, младшие знакимантиссы — его идентификатор111111x...xxнеприменимо[declet]...Сигнальный sNaN, младшие знакимантиссы — его идентификатор Младшие знаки (деклеты) мантиссы кодируются согласно DPD.

Формат decimal32 Формат decimal32 поддерживает 7 значащих десятичных знаков и диапазон значений экспоненты от −95 до +96, то есть от до . Когорта нуля имеет 192 возможных представлений (384, если включены все нули со знаком, в двух разных когортах). ЗнакКомбинированное поле(11 бит)Младшая часть мантиссы(20 бит)00111110001000000000000000000000BID: 2,097152e29DPD: 70001910903124231615870 +Примеры decimal32ЗначениеBIDDPDINFINITY0x780000000x78000000nand32("7")0x7c0000070x7c000007DEC32_TRUE_MIN0x000000010x00000001-DEC32_MAX0xf7f8967f0xf7f3fcff0.df0x00000000...0x32800000...0x5f8000000x00000000...0x22500000...0x43f000001917.11df0x311d40b60x3182ecdf0x262e74900x22326f91

Формат decimal64 Формат decimal64 поддерживает 16 значащих десятичных знаков и диапазон значений экспоненты от −383 до +384, то есть от до . Когорта нуля имеет 768 возможных представлений (1536, если включены все нули со знаком, в двух разных когортах). ЗнакКомбинированное поле(13 бит)Младшая часть мантиссы(50 бит)49403930292019109063565548474039323124231615870 +Примеры decimal64ЗначениеBIDDPDINFINITY0x78000000000000000x7800000000000000nand64("7")0x7c000000000000070x7c00000000000007DEC64_TRUE_MIN0x00000000000000010x0000000000000001-DEC64_MAX0xf7fb86f26fc0ffff0xf7fcff3fcff3fcff0.dd0x0000000000000000...0x31c0000000000000...0x5fe00000000000000x0000000000000000...0x2238000000000000...0x43fc0000000000001917.11dd0x3046cf99f48b9c00...0x318000000002ecdf0x260b9d2400000000...0x2230000000026f91

Формат decimal128 Формат decimal128 поддерживает 34 значащих десятичных знака и диапазон значений экспоненты от −6143 до +6144, то есть от до . Когорта нуля имеет 12288 возможных представлений (24576, если включены все нули со знаком, в двух разных когортах). ЗнакКомбинированное поле(17 бит)Младшая часть мантиссы(110 бит)1091009990898079706960595049403930292019109012712011911211110410396958887807972716463565548474039323124231615870 +Примеры decimal128ЗначениеBIDDPDINFINITY0x780000000000000000000000000000000x78000000000000000000000000000000nand128("7")0x7c0000000000000000000000000000070x7c000000000000000000000000000007DEC128_TRUE_MIN0x000000000000000000000000000000010x00000000000000000000000000000001-DEC128_MAX0xdfffed09bead87c0378d8e63ffffffff0xf7ffcff3fcff3fcff3fcff3fcff3fcff0.dl0x00000000000000000000000000000000...0x30400000000000000000000000000000...0x5ffe00000000000000000000000000000x00000000000000000000000000000000...0x22080000000000000000000000000000...0x43ffc0000000000000000000000000001917.11dl0x30045e85548021ac4530ad4cf0000000...0x303c000000000000000000000002ecdf0x2600b9d2400000000000000000000000...0x22078000000000000000000000026f91

Примечания

Литература Decimal Floating-Point: Algorism for Computers // Proceedings of the 16th IEEE Symposium on Computer Arithmetic (, 2003)

Ссылки Intel Decimal Floating-Point Math Library libmpdec — arbitrary precision decimal floating point C/C++ library

Категория:Арифметика с плавающей запятой