我想了解以下背后的科学知识。 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
答案 0 :(得分:0)
(...)
float
类型(由显式投射强加)只有6位有效数字。所以4294967296.0f
将只是429496e4
(在数学中:429496 * 10 ^ 4)。这就是为什么这种类型除了玩耍之外什么都不值钱。好吧,我应该在开头说这个:44100.0/48000
应该给你想要的结果。 :P
答案 1 :(得分:0)
这是我正在寻找的答案
向左移位将提供存储来自除法的精确值的位数。
将这些位表示的整数值除以2位移量的幂将返回精度值
e.g
<00> 0000 0001 * 2 ^ 8 = 1 0000 0000 = 256(基数10)1 0000 0000/2 = 1000 0000 = 128(基数10)
128/2 ^ 8 = 0.5