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 ビットです。
<--- 1バイト幅 --->
+----+----+----+----+----+----+----+----+
| 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] には 8 つの時間値が存在し, 各時間値間のステップサイズは ~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 と同じ) です。