4. A Compact Time Representation with Logarithmic Range (具有对数范围的紧凑时间表示)
4. A Compact Time Representation with Logarithmic Range (具有对数范围的紧凑时间表示)
本文档使用 "Information-Centric Networking (ICN) Adaptation to Low-Power Wireless Personal Area Networks (LoWPANs)" (信息中心网络对低功耗无线个域网的适配) 中描述的紧凑时间表示 (参见 [RFC9139] 的第 7 节), 该表示受到 [RFC5497] 和 [IEEE.754.2019] 的启发。其对数编码支持从毫秒到年的表示范围。图 1 描绘了这种时间表示的对数特性。
|| | | | | | | | | | |
+-----------------------------------------------------------------+
毫秒 年
图 1: 对数范围表示允许在较小的时间范围内具有更高的精度, 同时仍然支持大的时间增量。
时间码 (time code) 在单个字节中编码指数 (exponent) 和尾数 (mantissa) 值。与 [IEEE.754.2019] 中的表示相反, 时间码仅编码非负数, 因此不包括用于指示整数符号的单独位。图 2 显示了时间码的配置: 指数宽度为 5 位, 尾数宽度为 3 位。
<--- 一字节宽度 --->
+----+----+----+----+----+----+----+----+
| exponent (b) | mantissa (a) |
| 指数 (b) | 尾数 (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] 中存在八个时间值, 每个时间值之间的步长为 ~0.0078125s。此配置还以秒为单位编码以下方便的数字: [1, 2, 4, 8, 16, 32, 64, ...]。附录 A 包含测试向量以说明对数范围。
图 3 中给出了一个将时间值编码为相应指数和尾数的示例算法, 以伪代码形式表示。并非所有时间值都可以由时间码表示。对于这些情况, 会生成一个时间码, 该时间码表示最接近且小于初始时间值输入的时间值。
input: float v // 时间值
output: int a, b // 时间码的尾数, 指数
(a, b) encode (v):
if (v == 0)
return (0, 0)
if (v < 2 * C) // 次正规
a = floor (v * 4 / C) // 向下取整
return (a, 0)
else // 正规
if (v > (1 + 7/8) * 2^31 * C) // 检查边界
return (7, 31) // 返回最大值
else
b = floor (log2(v / C)) // 向下取整
a = floor ((v / (2^b * C) - 1) * 8) // 向下取整
return (a, b)
图 3: 伪代码形式的算法。
例如, 不存在 0.063 的特定时间码。但是, 此算法映射到最接近的有效时间码, 该时间码小于 0.063, 即指数 1 和尾数 0 (与时间值 0.0625 相同)。