|
4
|
| edgar.holleis · 技术社区 · 17 年前 |
|
|
1
3
我想你说的是正确处理数字圈的包围圈。实际上,这很容易。 这并不完全符合你所说的(不确定为什么会有“异常”间隔),但是:
编辑 :在diff=-32768处有一个“分支点”,因此如果a=5且b=32772,diff=-32767小于0,因此5比32772“早”。如果a=5,b=32774,diff=-32769=32767,大于0,因此5“迟于”32774。这在(a)最简单的数学意义上定义了“早”和“晚”,以及(b)因为环绕计数器可以解释为具有多个解决方案mod 65536,所以它选择了相对于数字圆彼此“最近”的A和B的解。 如果A和B相差32768,那么它们的距离相等,简单的数学用于选择最简单的…这“违背”了“早”和“晚”的反对称性质,在这个意义上,Islater(532773)是真的,Islater(32773,5)也是真的。但是你怎么知道“5”代表5的计数,还是“5”代表65541的计数?(正如abs(-32768)==-32768给出了一个奇怪的无意义的答案)如果您希望保持反对称,例如islater(b,a)==isearlier(a,b),那么您可以始终这样做:
如果希望将分支点偏向一个方向,使其发生在-32768+K处,则使用此选项:
这不再使用最近的;例如,如果k=12768,a=5,则b=6,7,8,9,…20005,Isearlier(A,B)和Islater(B,A)为真,对于B=20006,20007,…65534、65535、0、1、2、3、4、5等早期(A、B)和更高级(B、A)将为假。 您有一个特定的间隔选择,这与我使用的环绕数的基本原理不同。这里定义的函数不能满足您的需求,但是我发现这些间隔的选择有点特别。也许你可以解释一下你是如何决定的? |
|
|
2
1
首先计算差异,然后检查它落在哪个窗口中。 因为它非常简单,过去/未来/错误窗口的大小也各不相同,所以您必须自己做。 |
|
|
3
1
好的,记录在案。这是我的解决方案,这就是我的意思:
|
|
|
4
0
在我看来,你刚刚写的是:)。 为什么不把你的文章翻译成C代码呢? |
|
|
5
0
请记住,您不能让“>”和“<”在C中执行您想要的操作。它们仅适用于数字,并且不存在运算符重载。同样的事情也适用于您的异常;C没有异常。 您可以编写一些访问函数,以这种方式处理无符号整型,这并不困难。(在C语言中,有符号积分类型的溢出是未定义的,尽管在大多数现代系统中它都是环绕的。)这并不难。 |