2015-04-14 100 views
-1

我想知道以下背后的科学。 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 
+1

确定它的'0xffffff'和不'0xffffffff'? – Wintermute

+0

** - 1 **不是真正的代码。在Python中尝试你的第一个例子,表达式'(phase&0xffffff)*(1.0/4294967296.0)'产生'0.0007812499534338713'。 –

+0

对于您在某处看到的实际示例,请注意,无符号32位int的最大值为2^32-1,非常接近您引入的2^32因子。所以结果(对于那个原始的例子)几乎是相同的。 –

回答

0

这是我寻找

位左移将提供数在其中的精度谷存储从除法位的答案。

除以这些比特表示整数值由2分配到比特移位量的功率将返回精度值

例如

0000 0001 * 2^8 = 1 0000 0000 = 256(基地10)

1 0000 0000/2 = 1000 0000 = 128(基体10)

128/2^8 = 0.5

0

(...)

  1. 如果将两个整数时丢失精度,你应该记住的剩余部分。
  2. C++中的提示可以通过44100%48000来实现。
  3. 其实这些都是常数,它完全清楚44100/48000 == 0,所以剩下的就是你所拥有的。
  4. 那么,提醒甚至会 - 猜猜看 - 44100!
  5. float类型(由显式强制转换)只有6位有效数字。所以4294967296.0f将只是429496e4(在数学:429496 * 10^4)。这就是为什么这种类型对任何东西都没有价值,只是玩耍而已。
  6. 获取固定整数类型的值的最佳方法是设置所有位,并且不会错过0xfffff中正确数量的'f',即使用〜运算符和0值。在你的情况下,〜uint32_t(0)。

那么,我应该在开头说:44100.0/48000应该给你你想要的结果。 :P

+0

我的问题不是为什么我失去了精确度,这是什么是这种风格的分工过程。 –

+0

那么你的问题是什么呢?你在“问题”中的陈述太不清楚,无法猜测你想知道的内容。第5点会回答吗? – Ethouris