【问题标题】:Can you help me to identify the rounding of this application?你能帮我确定这个应用程序的四舍五入吗?
【发布时间】:2016-05-27 11:01:31
【问题描述】:

我有一个应用程序,它使用 44100 的采样率输出代表 1/96 节拍的缓冲区块(我们称之为脉冲)。

在恒定的 120 BPM 下,我每秒有 2 拍,所以每拍 22050 个样本,因此每个脉冲 229,6875 个样本。这些是我从应用程序中获得的第一个值:

0
230
459
689
919
1148
1378
1608
1838
2067
2297
2527
2756
2986
3216
3445
3675
3905
4134
4364
4594
4823
5053
5283
5512
5742
5972
6202
6431

注意两点:

  1. 它使用 Round half to Even 对值进行四舍五入;
  2. 由于四舍五入,缓冲区之间的距离可以是 229 或 230。

在恒定的 190 BPM 下,我每个脉冲有 145,0657895 个样本。我得到的第一个值:

0
145
290
435
580
725
870
1015
1161
1306
1451
1596
1741
1886
2031
2176
2321
2466
2611
2756
2901
3046
3191
3337
3482
3627
3772
3917
4062

和以前一样,将一半舍入到偶数,现在距离可以是 145 或 146。

嗯,到这里为止没什么难的。现在!如果我以 120 BPM 启动应用程序并在 25 个脉冲后切换到 190 BPM,切换后我得到一个奇怪的距离:

0
230     // distance 230
459     // distance 229
689     // distance 230
919     // distance 230
1148    // distance 229
1378    // distance 230
1608    // distance 230
1838    // distance 230
2067    // distance 229
2297    // distance 230
2527    // distance 230
2756    // distance 229
2986    // distance 230
3216    // distance 230
3445    // distance 229
3675    // distance 230
3905    // distance 230
4134    // distance 229
4364    // distance 230
4594    // distance 230
4823    // distance 229
5053    // distance 230
5283    // distance 230
5512    // distance 229
5742    // distance 230 - here I switch
5887    // distance 145
6032    // distance 145
6177    // distance 145
6322    // distance 145
6468    // distance 146

为什么最后 146 个值 (6468)?

在您看来,由于“什么”,prev 缓冲区之间的距离是 146 而不是 145?尝试在每次迭代时舍入下一个/上一个,但在那里获得 145 作为值似乎是正确的。取而代之的是 146。

这让我所有的计数器都感到困惑。有什么线索吗?

【问题讨论】:

    标签: algorithm function math rounding approximation


    【解决方案1】:
     229.6875 * 25 = 5742.1875
     145.0657895 * 5 = 725.3289475
     5742.1875 + 725.3289475 = 6467.5164475 rounding to 6468
    

    请注意,基本计算是以精确(仅是浮点数)数字进行的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多