跳到主要内容

4. 具有对数范围的紧凑时间表示

4. 具有对数范围的紧凑时间表示 (A Compact Time Representation with Logarithmic Range)

本文档使用 "Information-Centric Networking (ICN) Adaptation to Low-Power Wireless Personal Area Networks (LoWPANs)" 中描述的紧凑时间表示 (compact time representation, 见 [RFC9139] 第 7 节), 该表示受到 [RFC5497] 和 [IEEE.754.2019] 的启发. 其对数编码支持从毫秒到年的表示范围. 图 1 描绘了这种时间表示的对数特性.

 || |  |   |    |     |      |       |        |         |          |
+-----------------------------------------------------------------+
milliseconds years

图 1: 对数范围表示允许在较小的时间范围内获得更高精度, 同时仍支持较大的时间差值.

时间码 (time code) 在单个字节中编码指数 (exponent) 和尾数 (mantissa) 值. 与 [IEEE.754.2019] 中的表示不同, 时间码只编码非负数, 因此不包含用于指示整数符号性的独立比特. 图 2 展示了时间码的配置: 指数宽度为 5 比特, 尾数宽度为 3 比特.

              <---          one byte wide          --->
+----+----+----+----+----+----+----+----+
| exponent (b) | mantissa (a) |
+----+----+----+----+----+----+----+----+
0 1 2 3 4 5 6 7

图 2: 带有指数和尾数的时间码, 用于编码对数范围时间表示.

时间值的基本单位是秒. 时间值使用以下公式计算 (采自 [RFC5497] 和 [RFC9139]), 其中 (a) 表示尾数, (b) 表示指数, (C) 是常数因子, 设为 C := 1/32.

次正规 (Subnormal, b == 0): (0 + a/8) * 2 * C

正规 (Normalized, b > 0): (1 + a/8) * 2^b * C

次正规形式在零和最小正规数之间提供渐进下溢. 次正规范围 [0s,~0.0546875s] 内存在 8 个时间值, 相邻时间值之间的步长为 ~0.0078125s. 该配置还会编码以下以秒为单位的便捷数值: [1, 2, 4, 8, 16, 32, 64, ...]. 附录 A 包含用于说明对数范围的测试向量.

图 3 以伪代码给出了一个示例算法, 用于将时间值编码为对应的指数和尾数. 并非所有时间值都能由时间码表示. 对于这些情形, 生成的时间码会表示一个最接近且小于初始时间值输入的时间值.

 input: float v    // time value
output: int a, b // mantissa, exponent of time code

(a, b) encode (v):

if (v == 0)
return (0, 0)

if (v < 2 * C) // subnormal
a = floor (v * 4 / C) // round down
return (a, 0)
else // normalized
if (v > (1 + 7/8) * 2^31 * C) // check bounds
return (7, 31) // return maximum
else
b = floor (log2(v / C)) // round down
a = floor ((v / (2^b * C) - 1) * 8) // round down
return (a, b)

图 3: 伪代码形式的算法.

例如, 不存在专门表示 0.063 的时间码. 不过, 该算法会映射到小于 0.063 的最接近有效时间码, 即指数 1 和尾数 0 (与时间值 0.0625 相同).