excess-65 指数格式是什么?
What is the excess-65 exponent format?
根据 IBM Informix 文档:
DECIMAL(p, s)
values are stored internally with the first byte representing a sign bit and a 7-bit exponent in excess-65 format.
"excess-65" 格式如何工作?
参考资料
该表示法特定于 Informix 及其 DECIMAL 和 MONEY 类型 — 据我所知,没有其他产品使用它。 Informix 还在其 DATETIME 和 INTERVAL 类型中使用它,但这是大部分的实现细节。
我一直都知道 on-disk 形式是 'excess-64' 而不是 'excess-65';我不确定哪个是正确的,但我认为 64 有一个坚实的基础。
'excess-6n'形式用于磁盘存储。它的好处是可以使用 memcmp()
比较磁盘格式中的两个十进制值以获得正确的比较(尽管 NULL 值必须单独处理——NULL 值总是会导致痛苦和悲伤)。
来自 ESQL/C(和 C-ISAM)的 decimal.h
header 包含信息:
/*
* 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。还要注意 'decimal' 在某些方面是用词不当;数据使用 'centesimal'(base-100)表示法表示。
这里有一些示例值、十进制表示以及 on-disk 格式的字节。请注意,在某种程度上,字节数是任意的。如果使用 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
以此类推
根据 IBM Informix 文档:
DECIMAL(p, s)
values are stored internally with the first byte representing a sign bit and a 7-bit exponent in excess-65 format.
"excess-65" 格式如何工作?
参考资料
该表示法特定于 Informix 及其 DECIMAL 和 MONEY 类型 — 据我所知,没有其他产品使用它。 Informix 还在其 DATETIME 和 INTERVAL 类型中使用它,但这是大部分的实现细节。
我一直都知道 on-disk 形式是 'excess-64' 而不是 'excess-65';我不确定哪个是正确的,但我认为 64 有一个坚实的基础。
'excess-6n'形式用于磁盘存储。它的好处是可以使用 memcmp()
比较磁盘格式中的两个十进制值以获得正确的比较(尽管 NULL 值必须单独处理——NULL 值总是会导致痛苦和悲伤)。
来自 ESQL/C(和 C-ISAM)的 decimal.h
header 包含信息:
/*
* 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。还要注意 'decimal' 在某些方面是用词不当;数据使用 'centesimal'(base-100)表示法表示。
这里有一些示例值、十进制表示以及 on-disk 格式的字节。请注意,在某种程度上,字节数是任意的。如果使用 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
以此类推