我怎样才能得到浮点数的前n位为Python中的整数 [英] How can I get first n bits of floating point number as integer in python

查看:462
本文介绍了我怎样才能得到浮点数的前n位为Python中的整数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有 0.625 ,因为浮点数是 0b.101 ,所以如果我想要前两位作为一个整数即 0b10 = 2 ,我怎样才能达到这个python?



我已经试过把这个数字改成2的幂数,然后转换成一个int,所以如果我想要 n C $ C> INT(0.625 *(2 ** N))。但是,这不适合我。



当我有一个大于 1 所以 24.548838022726972 会给我 392 而不是 12 。 ( 24.548838022726972 = 0b11000.100011001 ...

解决方案

如果您想要 n 最高有效位,一种方法是使用 math.frexp 将您的号码规范化范围 [0.5,1.0)。然后乘以 2 ** n ,并取整数部分会给你你所需要的。

 >>>导入数学
>>> math.frexp(24.54883)#有效数字和指数
(0.7671509375,5)
>>> math.frexp(24.54883)[0]#just the significantand
0.7671509375
>>> int(math.frexp(24.54883)[0] * 2 ** 4)#4 bit

$ / $ c

您可以使用 2 3 / library / math.html#math.ldexprel =nofollow> math.ldexp 函数来做第二部分的操作。 p>

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


Suppose I have 0.625 as a floating point is 0b.101, so if I want the first two bits of that as an integer i.e. 0b10 = 2, how can I achieve this in python?

I've tried taking the number to a power of 2 and casting to an int, so if I want n bits I do int(0.625*(2**n)). But that is not working for me.

The problem occurs when I have a number greater than 1 so 24.548838022726972 will give me 392 rather than 12 for the first four bits. (24.548838022726972 = 0b11000.100011001...)

解决方案

If you want the n most significant bits, one way to start is to use math.frexp to normalise your number to lie in the range [0.5, 1.0). Then multiplying by 2**n and taking the integer part will give you what you need.

>>> 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

Instead of explicitly computing a power of 2 to scale by, you could use the math.ldexp function to do the second part of the operation.

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

这篇关于我怎样才能得到浮点数的前n位为Python中的整数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆