Что такое формат показателя избытка-65? - PullRequest
0 голосов
/ 14 февраля 2019

В соответствии с документацией IBM Informix:

DECIMAL(p, s) значения хранятся внутри, причем первый байт представляет бит знака и 7-битную экспоненту в формате больше 65.

Как работает формат «extra-65»?

Ссылки

  1. DECIMAL (p, s) Типы данных
  2. ДЕСЯТИЧНОЕ Хранение

1 Ответ

0 голосов
/ 15 февраля 2019

Обозначение относится к Informix и его типам DECIMAL и MONEY - AFAIK, никакой другой продукт не использует его.Informix также использует его в своих типах DATETIME и INTERVAL, но это большая часть деталей реализации.

Я всегда знал, что форма на диске - это «extra-64», а не «extra-65».;Я не уверен, что это правильно, но я думаю, что 64 имеет твердую основу.

Форма «избыток-6n» используется для хранения на диске.Преимущество состоит в том, что два десятичных значения в формате диска можно сравнить с помощью memcmp(), чтобы получить правильное сравнение (хотя значения NULL должны обрабатываться отдельно - значения NULL всегда вызывают боль и горе).

Заголовок decimal.h из ESQL / C (и C-ISAM) содержит информацию:

/*
 * Packed Format  (format in records in files)
 *
 *    First byte =
 *        top 1 bit = sign 0=neg, 1=pos
 *        low 7 bits = Exponent in excess 64 format
 *    Rest of bytes = base 100 digits in 100 complement format
 *    Notes --  This format sorts numerically with just a
 *              simple byte by byte unsigned comparison.
 *              Zero is represented as 80,00,00,... (hex).
 *              Negative numbers have the exponent complemented
 *              and the base 100 digits in 100's complement
 */

Обратите внимание на упоминание 64, а не 65. Также обратите внимание, что десятичное число в некоторых отношениях является неправильным;данные представлены с использованием нотации «centesimal» (base-100).

Вот некоторые примеры значений, десятичное представление и затем байты для формата на диске.Обратите внимание, что в некоторой степени количество байтов является произвольным.Если используется что-то вроде DECIMAL (16,4), будет 1 байт, знак и показатель степени и 8 байтов данных (и диапазон показателей будет ограничен).Если вы используете DECIMAL (16) - для чисел с плавающей запятой - то диапазон показателей будет гораздо меньше ограничен.

Decimal value          Byte representation (hex)
 0                     80 00 00 00 00
 1                     C1 01
-1                     3E 63
 9.9                   C1 09 5A 00
-9.9                   3E 5A 0A 00
 99.99                 C1 63 63 00 00 00
-99.99                 3E 00 01 00 00 00
 999.999               C2 09 63 63 5A
-999.999               3D 5A 00 00 0A
 0.1                   C0 0A 00 00
-0.1                   3F 5A 00 00
 0.00012345            BF 01 17 2D 00
-0.00012345            40 62 4C 37 00
 1.2345678901234e-09   BC 0C 22 38 4E 5A 0C 22
-1.2345678901234e-09   43 57 41 2B 15 09 57 42
 1.2345678901234e+09   C5 0C 22 38 4E 5A 0C 22
-1.2345678901234e+09   3A 57 41 2B 15 09 57 42

И т. Д.

...