【发布时间】:2012-08-03 21:38:08
【问题描述】:
假设我有一个浮点数。我想提取数字的基数为 2 表示中所有个位的位置。
例如,10.25 = 2^-2 + 2^1 + 2^3,所以它的base-2位置是{-2, 1, 3}。
一旦我得到了一个数字n 的以 2 为底的幂的列表,以下应该总是返回 true(在伪代码中)。
sum = 0
for power in powers:
sum += 2.0 ** power
return n == sum
但是,在 C 和 C++ 中对浮点数执行位逻辑有点困难,更难移植。
如何在任何一种语言中使用少量 CPU 指令来实现这一点?
【问题讨论】:
-
这有点不可能移植,因为标准不保证 IEEE 浮点。另外,如果“ones”数字超出范围怎么办?
-
我实际上并不介意不可移植性,只要它可以在 Linux x86_64 上使用 gcc 并保证 IEEE 浮点数。任何其他架构都可以使用经过调整的代码或缓慢的幼稚方法。
-
避免低级别的按位操作有什么意义?
-
唯一合乎逻辑的解决方案是使用联合将浮点数转换为整数。然后提取指数并应用偏移量。如果为负数或 > 23/52,则超出范围。
-
不,你可以使用
frexp,然后它就变得完全便携了。
标签: c++ c floating-point bit-manipulation