如何在python中将前n位浮点数作为整数

时间:2016-03-13 20:10:33

标签: python floating-point bit

假设我0.625的浮点是0b.101,所以如果我希望它的前两位为整数,即0b10 = 2,怎么能我在python中实现了这个目标?

我已经尝试将数字加到2的幂并转换为int,所以如果我想要n位,我会int(0.625*(2**n))。但那不适合我。

如果我的数字大于1,则会出现此问题,因此24.548838022726972将为前四位提供392而不是12。 (24.548838022726972 = 0b11000.100011001...

4 个答案:

答案 0 :(得分:3)

您可以使用struct.pack()将浮点数转换为字节列表,然后从中提取您感兴趣的位。

答案 1 :(得分:3)

如果您想要n最重要的位,一种方法是使用math.frexp将您的数字标准化,使其位于[0.5, 1.0)范围内。然后乘以2**n并取整数部分将为您提供所需的信息。

>>> import math
>>> math.frexp(24.54883)  # significand and exponent
(0.7671509375, 5)
>>> math.frexp(24.54883)[0]  # just the significand
0.7671509375
>>> int(math.frexp(24.54883)[0] * 2**4)  # most significant 4 bits
12

您可以使用math.ldexp函数执行操作的第二部分,而不是显式计算2的幂来缩放。

>>> int(math.ldexp(math.frexp(24.54883)[0], 4))
12

答案 2 :(得分:0)

While the number is greater than or equal to 1, divide by 2.
Multiply by 2**n
Round or truncate to an integer.

以下是测试用例的简化Java程序:

public class Test {
  public static void main(String[] args) {
    double in = 24.548838022726972;
    while (in >= 1) {
      in /= 2;
      System.out.println(in);
    }
    in *= 16;
    System.out.println(in);
    System.out.println((int) in);
  }
}

输出:

12.274419011363486
6.137209505681743
3.0686047528408715
1.5343023764204358
0.7671511882102179
12.274419011363486
12

答案 3 :(得分:0)

使用内置函数获取IEEE 754 format中尾数的有效位的直接方法是:

In [2]: u=24.54883

In [3]: bin(u.as_integer_ratio()[0])
Out[3]: '0b11000100011001000000000011111011101010001000001001101'

In [4]: u=.625

In [5]: bin(u.as_integer_ratio()[0])
Out[5]: '0b101'

您获得0b1 +尾数而不显着0。