帖子Google's Leap Second Smear Techinque中提到的公式:在午夜之前的时间窗口内调整“谎言”:
lie(t) = (1.0 - cos(pi * t / w)) / 2.0
这背后的数学没有描述。有人可以解释为什么公式有效。这也可以用于我们想要在窗口上逐渐同步时间并避免突然跳跃的任何情况吗?
答案 0 :(得分:41)
这是有效的,因为cos(x)
的图表会随着时间的推移而变化。它并没有突然改变,尽管它确实发生了非线性变化。
假设我们正在w = 86400
的窗口上涂抹。以下是从t = 0
到t = 86400
的谎言:
在一天开始时,我们所说的谎言非常小。您报告的时间(t + lie(t)
)几乎与实际时间相同(t
)。您报告的涂抹时间也随着时间的推移而变化非常缓慢。理想情况下,对于通过你的每1个实际秒,你应该报告1秒已经过去了。在涂抹的时候,你看到的是:
到了中午,我们看到了最大的变化。但这些变化大约为10^-5
。它们足够小,任何接受涂抹时间的人都不会怀疑出现问题。在中午,你谈的是微动差的移动速度。
在谷歌的情况下,他们希望平稳地改变非常慢的时间,以便不会发生局部更正。如果他们突然将时间改变一秒钟,则可能发生局部校正。从博客文章来看,听起来这通常会导致非常糟糕的事情发生(即东西休息)。
有一点需要注意的是,他们可能不会在一天之内涂抹闰秒。可能整整一年。在这种情况下,变化甚至更小。在这种情况下,日常更改大约为纳秒级。
如果你想知道实际的数学 - 那部分不是很有趣。 cos(x)
以[-1,+ 1]为界。在x = 0
,我们cos(0) = 1
和x = pi
,cos(pi) = -1
。值t / w
从t = 0 ... w
从0线性增加到1。因此,cos(pi * t / w)
从+1
t = 0
更改为-1
t = w
。其余部分来自于此。
cos(x)
的周期性质实际上非常重要。我们不能只选择lie(t) = t / w
之类的东西。如果我们这样做,谎言会随着时间的推移而增加。闰秒将继续以每秒1 / w
的速度堆积。 cos(x)
具有在-1
和+1
之间振荡的属性。
答案 1 :(得分:2)
我猜想。
cos()输出-1到+1范围内的值 所以,当cos为-1时,最大的谎言是,因为
(1.0 - -1)/2 == 1.0
和cos为+1时的最小值
(1.0 - 1)/2 == 0.0
请注意,0.0对于“无谎言”是合适的值,1.0对于“闰秒”是合适的值。
这是一个函数图,你可以看到它从0到1有一个漂亮而平滑的逐渐过渡。
至于用于计算cos:pi * t / w
的参数的表达式,它们可以被认为是改变函数从-1转换为1的速度/间隔。使t更大使其转换更快,并且使w更大使其转换更慢。
他们提到w是应用官方闰秒之前的时间窗口,因此请在几秒钟内完成。然后,t可能会增加一些,可能会再次增加。