假设我有一个系统将8820个值分配到96个值中,使用Banker's Round(称为他们的pulse
)进行舍入。其计算公式为:如何检查范围内的值是否来自另一个范围的值的倍数?
pulse = BankerRound(8820 * i/96), with i[0,96[
因此,这是脉冲的列表:
0
92
184
276
368
459
551
643
735
827
919
1011
1102
1194
1286
1378
1470
1562
1654
1746
1838
1929
2021
2113
2205
2297
2389
2481
2572
2664
2756
2848
2940
3032
3124
3216
3308
3399
3491
3583
3675
3767
3859
3951
4042
4134
4226
4318
4410
4502
4594
4686
4778
4869
4961
5053
5145
5237
5329
5421
5512
5604
5696
5788
5880
5972
6064
6156
6248
6339
6431
6523
6615
6707
6799
6891
6982
7074
7166
7258
7350
7442
7534
7626
7718
7809
7901
7993
8085
8177
8269
8361
8452
8544
8636
8728
现在,假设系统不直接发送给我这些脉冲。相反,它发送的第八千八百二这些脉冲(称他们为tick
):
tick = value * 1/8820
蜱的名单我得到变成:
0
0.010430839
0.020861678
0.031292517
0.041723356
0.052040816
0.062471655
0.072902494
0.083333333
0.093764172
0.104195011
0.11462585
0.124943311
0.13537415
0.145804989
0.156235828
0.166666667
0.177097506
0.187528345
0.197959184
0.208390023
0.218707483
0.229138322
0.239569161
0.25
0.260430839
0.270861678
0.281292517
0.291609977
0.302040816
0.312471655
0.322902494
0.333333333
0.343764172
0.354195011
0.36462585
0.375056689
0.38537415
0.395804989
0.406235828
0.416666667
0.427097506
0.437528345
0.447959184
0.458276644
0.468707483
0.479138322
0.489569161
0.5
0.510430839
0.520861678
0.531292517
0.541723356
0.552040816
0.562471655
0.572902494
0.583333333
0.593764172
0.604195011
0.61462585
0.624943311
0.63537415
0.645804989
0.656235828
0.666666667
0.677097506
0.687528345
0.697959184
0.708390023
0.718707483
0.729138322
0.739569161
0.75
0.760430839
0.770861678
0.781292517
0.791609977
0.802040816
0.812471655
0.822902494
0.833333333
0.843764172
0.854195011
0.86462585
0.875056689
0.88537415
0.895804989
0.906235828
0.916666667
0.927097506
0.937528345
0.947959184
0.958276644
0.968707483
0.979138322
0.989569161
不幸的是,这些刻度之间发送给我也fake ticks
,那不是原来的pulses
的繁殖。比如0,029024943
,它是256
的倍数,不在脉冲列表中。
如何从此列表中找到哪些刻度是valid
哪些是fake
? 由于8820
会在此期间发生变化,因此我没有要在此过程中进行比较的脉冲列表,因此我没有列表逐步比较。我需要在每次迭代时从滴答中推断出它。
什么是最好的数学方法呢?也许推理只是在嘀嗒声而不是脉搏。
我以为找到最近的整数脉冲和prev/next tick之间的近似误差。 Here在C++:
double pulse = tick * 96.;
double prevpulse = (tick - 1/8820.) * 96.;
double nextpulse = (tick + 1/8820.) * 96.;
int pulseRounded=round(pulse);
int buffer=lrint(tick * 8820.);
double pulseABS = abs(pulse - pulseRounded);
double prevpulseABS = abs(prevpulse - pulseRounded);
double nextpulseABS = abs(nextpulse - pulseRounded);
if (nextpulseABS > pulseABS && prevpulseABS > pulseABS) {
// is pulse
}
但例如蜱0.0417234
(脉冲368
)失败,因为先前误差蜱似乎比它更接近:prevpulseABS
误差(0.00543795
)比pulseABS
误差(0.0054464
)小。
这是因为这个比较并不关心我猜的四舍五入。
为什么不只是将所有的脉冲值存储在列表中,并且系统在列表中向您发送值搜索时呢? – Dialecticus
你能否简化这个例子来处理六个数值而不是96?另请注意,SO使用英语,小数点分隔符是“。”,而不是“,”。 –
脉冲列出它不是我可以检查和比较的固定列表。 8820可能因时间而异,因此会产生蜱和脉冲。唯一真正的固定值是滴答。 – markzzz