t0 - t1 < 0
t0 < t1
当我们确定值的实际差异(溢出之前)不大于包含所有可能值的集合的一半或大小时,效果会更好。
对于纳秒,它将大约是 292 年(纳秒存储在 long 中,long
大小的一半是2^64/2
=2^63
纳秒 ~= 292 年)。
因此,对于间隔少于 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, ..
让我们看看差异将大于 4t0 - t1 < 0
且t0 < t1
不会大于 4 的值(循环大小的一半,-4 是最小值,这意味着它可以是计算 delta 的最小结果)。请注意,只有在溢出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
我们还是得到了正确的结果。
delta = 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
真
对于其他实际 delta = 1 的情况,我们还将获得正确的结果t0 < t1
和t0 - t1 < 0
测试(t0 - t1
将始终如此-1
)
delta = 3(几乎是周期的一半)
a1) 具有较大值的溢出
- 实际值:
t0 = 3
t1 = 6
- 溢出:
t0 = 3
t1 = -2
t0 < t1
==> 3 < -2
->假的
t0 - t1 < 0
==> 3 - (-2) < 0
==> -3 < 0
(5 溢出到 -3) true
a2) 另一种溢出情况
- 实际值:
t0 = 2
t1 = 5
- 溢出:
t0 = 2
t1 = -3
t0 < t1
==> 2 < -3
->假的
t0 - t1 < 0
==> 2 - (-3) < 0
==> -3 < 0
(再次 5 溢出到 -3)真
所以再次只t0 - t1 < 0
给出了正确的结果。
b)没有溢出 t0 - t1
将始终等于-3
(-delta),因此这将始终给出正确的结果。t0 < t1
也会给出正确的resilt
- 实际值:
t0 = -1
t1 = 2
t0 < t1
==> -1 < 2
->真
t0 - t1 < 0
==> -1 - 2 < 0
==>-3 < 0
真的
delta = 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
给出正确的结果。
显然,没有溢出的示例对于这两个测试都是正确的。
delta = 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 | - | - | + | - |
+-------------+------------+----------------+-----------+----------------+