你能帮我确定一下这个申请的四舍五入吗?

时间:2016-05-27 11:01:31

标签: algorithm function math rounding approximation

我有一个应用程序,使用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. 对值进行舍入
  3. 由于四舍五入,缓冲区之间的距离可以是229或230.
  4. 在常数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。

    这令我所有的柜台感到困惑。有线索吗?

1 个答案:

答案 0 :(得分:2)

 229.6875 * 25 = 5742.1875
 145.0657895 * 5 = 725.3289475
 5742.1875 + 725.3289475 = 6467.5164475 rounding to 6468

请注意,基础计算是以精确(仅浮点)数字

进行的