位掩码和二进制算法
bitmasking and binary arithmetic
我想知道以下背后的科学。一个 32 位的值在 64 位类型中被左移 32 次,然后进行除法。不知何故,精度包含在最后 32 位中,为了将值检索为浮点数,我可以在无符号 32 位 int 的最大值上乘以 1。
phase = ((uint64) 44100 << 32) / 48000;
(phase & 0xffffffff) * (1.0f / 4294967296.0f);// == 0.918749988
同
(float)44100/48000;// == 0.918749988
(...)
- 如果你在除以两个整数时失去了精度,你应该记住余数。
- 在你的情况下,可以通过执行 44100%48000 来获取 C++ 中的提醒。
- 实际上这些是常量,很明显 44100/48000 == 0,所以剩下的就是余数。
- 好吧,提醒甚至会是——你猜怎么着——44100!
float
类型(由显式强制转换强加)只有 6 位有效数字。所以 4294967296.0f
将只是 429496e4
(在数学中:429496*10^4)。这就是为什么这种类型除了玩耍之外没有任何价值。
- 获取所有位都已设置的固定整数类型的值,并且不会错过 0xfffff 中 'f' 的正确数量的最佳方法是使用 ~ 运算符和 0 值。在你的情况下,~uint32_t(0).
好吧,我应该在一开始就这样说:44100.0/48000
应该会给你想要的结果。 :P
这就是我要找的答案
向左移位将提供用于存储除法精度值的位数。
将这些位表示的整数值除以2的位移量次方将return精度值
例如
0000 0001 * 2^8 = 1 0000 0000 = 256(基数 10)
1 0000 0000 / 2 = 1000 0000 = 128(基数 10)
128 / 2^8 = 0.5
我想知道以下背后的科学。一个 32 位的值在 64 位类型中被左移 32 次,然后进行除法。不知何故,精度包含在最后 32 位中,为了将值检索为浮点数,我可以在无符号 32 位 int 的最大值上乘以 1。
phase = ((uint64) 44100 << 32) / 48000;
(phase & 0xffffffff) * (1.0f / 4294967296.0f);// == 0.918749988
同
(float)44100/48000;// == 0.918749988
(...)
- 如果你在除以两个整数时失去了精度,你应该记住余数。
- 在你的情况下,可以通过执行 44100%48000 来获取 C++ 中的提醒。
- 实际上这些是常量,很明显 44100/48000 == 0,所以剩下的就是余数。
- 好吧,提醒甚至会是——你猜怎么着——44100!
float
类型(由显式强制转换强加)只有 6 位有效数字。所以4294967296.0f
将只是429496e4
(在数学中:429496*10^4)。这就是为什么这种类型除了玩耍之外没有任何价值。- 获取所有位都已设置的固定整数类型的值,并且不会错过 0xfffff 中 'f' 的正确数量的最佳方法是使用 ~ 运算符和 0 值。在你的情况下,~uint32_t(0).
好吧,我应该在一开始就这样说:44100.0/48000
应该会给你想要的结果。 :P
这就是我要找的答案
向左移位将提供用于存储除法精度值的位数。
将这些位表示的整数值除以2的位移量次方将return精度值
例如
0000 0001 * 2^8 = 1 0000 0000 = 256(基数 10)
1 0000 0000 / 2 = 1000 0000 = 128(基数 10)
128 / 2^8 = 0.5