t0 - t1 < 0 优于 t0 < t1 当我们确定 real 值的差异(溢出前)不大于包含所有可能的值。
对于纳秒,它将大约是 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, ..
让我们看看t0 - t1 < 0 和t0 < t1 对于差异将大于和不会大于 4 的值(循环大小的一半,-4 是最小值,这意味着它可以是计算的最小结果三角洲)。请注意,当t1 溢出时,只有t0 - t1 < 0 会给出正确的结果
-
delta = 1 overflow 具有较大的值(注意:我们不会使较小的值溢出,因为这意味着两个值都在同一个周期,所以计算就像没有溢出一样)
- 实际值:
t0 = 3t1 = 4
- 溢出:
t0 = 3t1 = -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 = 3t1 = 6
- 溢出:
t0 = 3t1 = -2
-
t0 < t1 ==> 3 < -2 -> 假
-
t0 - t1 < 0 ==> 3 - (-2) < 0 ==> -3 < 0 (5 溢出到 -3) true
a2) 溢出
的另一种情况
- 实际值:
t0 = 2t1 = 5
- 溢出:
t0 = 2t1 = -3
-
t0 < t1 ==> 2 < -3 -> 假
-
t0 - t1 < 0 ==> 2 - (-3) < 0 ==> -3 < 0(再次溢出 5 次到 -3)true
所以再次只有t0 - t1 < 0 给出了正确的结果。
b) 无溢出 t0 - t1 将始终等于 -3 (-delta),因此这将始终给出正确的结果。 t0 < t1 也会给出正确的resilt
- 实际值:
t0 = -1t1 = 2
-
t0 < t1 ==> -1 < 2 -> 真
-
t0 - t1 < 0 ==> -1 - 2 < 0 ==> -3 < 0 真
-
t0 - t1 的 delta = 4 结果将始终等于 -4,因此它也将是 <0。
示例溢出
a1)
- 实际值:
t0 = 0t1 = 4
- 溢出:
t0 = 0t1 = -4
-
t0 < t1 ==> 0 < -4 -> 假
-
t0 - t1 < 0 ==> 0 - (-4) < 0 ==> -4 < 0(4 溢出到 -4)true
a2)
- 实际值:
t0 = 1t1 = 5
- 溢出:
t0 = 1t1 = -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 = -1t1 = 4
- 溢出:
t0 = -1t1 = -4
-
t0 < t1 ==> -1 < -4 -> 假
-
t0 - t1 < 0 ==> -1 - (-4) < 0 ==> 3 < 0 false
a2) 溢出
- 实际值:
t0 = 1t1 = 6
- 溢出:
t0 = 1t1 = -2
-
t0 < t1 ==> 1 < -2 -> 假
-
t0 - t1 < 0 ==> 1 - (-2) < 0 ==> 3 < 0 假
两项测试均失败
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 | - | - | + | - |
+-------------+------------+----------------+-----------+----------------+