t0 - t1 < 0
値の実際の差 (オーバーフロー前) が、すべての可能な値を含むセットの半分またはサイズを超えていないt0 < t1
ことが確実な場合よりも優れています。
ナノ秒の場合、約 292 年になります (ナノ秒は long に格納され、サイズの半分は=ナノ秒 ~= 292 年です)。
long
2^64/2
2^63
したがって、292 年未満で区切られた時間サンプルについてはt0 - t1 < 0
、正しい結果を得るために使用する必要があります。
より視覚化するために、サイクルには 8 つの可能な値が含まれているとしましょう-4, -3, -2, -1 ,0, 1, 2, 3
。
タイムラインは次のようになります
real time values: .., -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, ..
overflowed values: .., 2, 3, -4, -3, -2, -1, 0, 1, 2, 3, -4, -3, -2, -1, ..
差が 4 を超えない場合 (サイクル サイズの半分、-4 は最小値であり、デルタを計算するための最小結果になる可能性があることを意味します) の値に対してどのように動作し、どのように動作するかt0 - t1 < 0
を見てみましょう。オーバーフローした場合にのみ正しい結果が得られることにt0 < t1
注意してくださいt0 - t1 < 0
t1
delta = 1大きい方の値のオーバーフローあり (注意:小さい方の値のオーバーフローは行いません。これは、両方の値が同じサイクルにあることを意味するため、計算はオーバーフローがない場合と同じになるためです)
- 実際の値:
t0 = 3
t1 = 4
- オーバーフロー:
t0 = 3
t1 = -4
t0 < t1
==> 3 < -4
->偽
t0 - t1 < 0
==> 3 - (-4) < 0
==> -1 < 0
(7 回のオーバーフローで -1) true
そのため、オーバーフローにもかかわらず、またはおそらくオーバーフローのおかげで、t0 - t1 < 0
正しい結果が得られました。
デルタ = 1ですが、今回はオーバーフローはありません
a) 正の値
t0 = 2
、t1 = 3
2 < 3
真実
2 - 3 < 0
==>-1 < 0
真
b) 負の値
t0 = -4
、t1 = -3
-4 < -3
真実
-4 - (-3) < 0
==>-1 < 0
真
実際のデルタ = 1 の残りのケースでは、t0 < t1
とt0 - t1 < 0
テストの両方で正しい結果が得られます (t0 - t1
常に になります-1
) 。
デルタ = 3 (サイクルのほぼ半分)
a1)より大きな値のオーバーフロー
- 実際の値:
t0 = 3
t1 = 6
- オーバーフロー:
t0 = 3
t1 = -2
t0 < t1
==> 3 < -2
->偽
t0 - t1 < 0
==> 3 - (-2) < 0
==> -3 < 0
(-3 への 5 つのオーバーフロー) true
a2)オーバーフローを伴う別のケース
- 実際の値:
t0 = 2
t1 = 5
- オーバーフロー:
t0 = 2
t1 = -3
t0 < t1
==> 2 < -3
->偽
t0 - t1 < 0
==> 2 - (-3) < 0
==> -3 < 0
(再び 5 回のオーバーフローで -3) true
したがって、再びt0 - t1 < 0
正しい結果のみが得られました。
b)オーバーフローなし は常に(-delta)t0 - t1
と等しくなるため、常に正しい結果が得られます。また、正しい反発力を与えます-3
t0 < t1
- 実際の値:
t0 = -1
t1 = 2
t0 < t1
==> -1 < 2
->真
t0 - t1 < 0
==> -1 - 2 < 0
==>-3 < 0
真
デルタ = 4の結果t0 - t1
は常に と等しくなる-4
ため、 も となります<0
。
オーバーフローの例
a1)
- 実際の値:
t0 = 0
t1 = 4
- オーバーフロー:
t0 = 0
t1 = -4
t0 < t1
==> 0 < -4
->偽
t0 - t1 < 0
==> 0 - (-4) < 0
==> -4 < 0
(-4 への 4 つのオーバーフロー) true
a2)
- 実際の値:
t0 = 1
t1 = 5
- オーバーフロー:
t0 = 1
t1 = -3
t0 < t1
==> 1 < -4
->偽
t0 - t1 < 0
==> 1 - (-3) < 0
==> -4 < 0
(-4 への 4 つのオーバーフロー) true
したがってt0 - t1 < 0
、正しい結果のみを返します。
オーバーフローのない例は、両方のテストで明らかに正しいでしょう。
デルタ = 5 (およびそれ以上)
a1) オーバーフローあり
(最小値 tor t0 は -1 なので、それから始めましょう)
- 実際の値:
t0 = -1
t1 = 4
- オーバーフロー:
t0 = -1
t1 = -4
t0 < t1
==> -1 < -4
->偽
t0 - t1 < 0
==> -1 - (-4) < 0
==>3 < 0
偽
a2) オーバーフローあり
- 実際の値:
t0 = 1
t1 = 6
- オーバーフロー:
t0 = 1
t1 = -2
t0 < t1
==> 1 < -2
->偽
t0 - t1 < 0
==> 1 - (-2) < 0
==> 3 < 0
false
両方のテストが失敗しました
b1) オーバーフローなし
t0 = -4
、t1 = 1
-4 < 1
真実
-4 - 1 < 0
==> 3 < 0
(-5 から 3 へのオーバーフロー) false
+-------------+-----------------------------+----------------------------+
| tests if | delta <= size of half cycle | delta > size of half cycle |
| t0 is less |-----------------------------|----------------------------|
| than t1 | overflow | no overflow | overflow | no overflow |
|-------------|------------|----------------|-----------|----------------|
| t0 < t1 | - | + | - | + |
|-------------|------------|----------------|-----------|----------------|
| t0 - t1 < 0 | + | + | - | + |
|-------------|------------|----------------|-----------|----------------|
| t0 - t1 > 0 | - | - | + | - |
+-------------+------------+----------------+-----------+----------------+