你能帮我确定这个应用程序的四舍五入吗?
Can you help me to identify the rounding of this application?
我有一个应用程序,它使用 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
注意两件事:
- 它使用 Round half to Even;
对值进行四舍五入
- 由于四舍五入,缓冲区之间的距离可以是 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)?
在您看来,由于 "what" prev 缓冲区之间的距离是 146 而不是 145?尝试在每次迭代时舍入 next/prev,但在那里获得 145 作为值似乎是正确的。取而代之的是 146.
这让我所有的柜台都感到困惑。有什么线索吗?
229.6875 * 25 = 5742.1875
145.0657895 * 5 = 725.3289475
5742.1875 + 725.3289475 = 6467.5164475 rounding to 6468
请注意,基础计算是以精确的(仅是浮点数)数字进行的
我有一个应用程序,它使用 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
注意两件事:
- 它使用 Round half to Even; 对值进行四舍五入
- 由于四舍五入,缓冲区之间的距离可以是 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)?
在您看来,由于 "what" prev 缓冲区之间的距离是 146 而不是 145?尝试在每次迭代时舍入 next/prev,但在那里获得 145 作为值似乎是正确的。取而代之的是 146.
这让我所有的柜台都感到困惑。有什么线索吗?
229.6875 * 25 = 5742.1875
145.0657895 * 5 = 725.3289475
5742.1875 + 725.3289475 = 6467.5164475 rounding to 6468
请注意,基础计算是以精确的(仅是浮点数)数字进行的