微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

浮动到二进制

如何解决浮动到二进制

一个答案有一点理论性。

每个浮点数都表示为小数部分乘以指数乘以符号。此外,还有所谓的指数偏差,将在下面解释。

所以我们有

  1. 签位
  2. 小数位数
  3. 指数部分数字

小数部分的位告诉我们下面的序列中哪些求和数(要加的数字)将包括在表示的数值中

2 ^ -1 + 2 ^ -2 + 2 ^ -3 + 2 ^ -4 + 2 ^ -5 + 2 ^ -6 + 2 ^ -7 + 2 ^ -8

因此,如果您在小数部分说01101101,它会给出

0 * 2 ^ -1 + 1 * 2 ^ -2 + 1 * 2 ^ -3 + 0 * 2 ^ -4 + 1 * 2 ^ -5 + 1 * 2 ^ -6 + 0 * 2 ^ -7 + 1 * 2 ^ -8 = 0.42578125

现在可以这样表示的非零数字介于2 -8 = 0.99609375之间

指数部分出现在这里。指数允许我们通过将分数部分乘以指数来表示非常大的数字。因此,如果我们有一个8位指数,我们可以将所得分数乘以0到2 ^ 255之间的数字。

因此,回到上面的示例,让我们采用11000011 = 195的指数。

我们的小数部分为01101101 = 0.42578125,指数部分为11000011 =195。它的乘积为0.42578125 * 2 ^ 195,这确实是一个大数字。

到目前为止,我们可以表示介于2 ^ -8 * 2 ^ 0和(1-2 ^ -8)* 2 ^ 255之间的非零数字。这允许很大的数字,但不允许很小的数字。为了能够表示少量数字,我们必须在指数中包括所谓的偏差。该数字将始终从指数中减去,以便表示较小的数字。

让我们假设偏差为127。现在所有指数都减去了127。因此可以表示的数字介于2 ^ -8 * 2 ^(0-127)和(1-2 ^ -8)* 2 ^(255-127)之间= 128)

示例数字现在为0.42578125 * 2 ^(195-127 = 68),仍然很大。

为了更好地理解这一点,请尝试对小数和指数部分使用不同的基数和大小进行实验。开始时不要尝试使用奇数基数,因为这只会使必要的事情复杂化。

一旦掌握了这种表示形式的工作原理,您就应该能够编写代码获取任何基本,分数/指数部分组合中任何数字的表示形式。

解决方法

我正在尝试将浮点数转换为二进制表示形式;我该如何实现?但是,我的目标是不受2m的限制,因此我希望可以轻松扩展到任何基准(3、4、8)ecc。

到目前为止,我已经有了一个简单的整数实现:

import string

LETTER = '0123456789' + string.ascii_lowercase
def convert_int(num,base):
    if base == 1:
        print "WARNING! ASKING FOR BASE = 1"
        return '1' * num if num != 0 else '0'

    if base > 36: raise ValueError('base must be >= 1 and <= 36')

    num,rest = divmod(num,base)
    rest = [LETTER[rest]]
    while num >= base:
        num,r = divmod(num,base)
        rest.append(LETTER[r])
    rest.reverse()
    return (LETTER[num] if num else '') + ''.join(str(x) for x in rest)

任何帮助表示赞赏:)

编辑:

def convert_float(num,base,digits=None):
    num = float(num)
    if digits is None: digits = 6

    num = int(round(num * pow(base,digits)))
    num = convert_int(num,base)
    num = num[:-digits] + '.' + num[:digits]
    if num.startswith('.'): num = '0' + num
    return num

是对的吗?为什么我会得到这种行为?

>>> convert_float(1289.2893,16)
'509.5094a0'
>>> float.hex(1289.2983)
'0x1.42531758e2196p+10'

ps [如何将浮点数转换为二进制?](http://codingdict.com/questions/191942

我已经阅读了该讨论,但没有得到答案。.我的意思是,它仅适用于0.25、0.125吗?我不明白“必须以相反的顺序”这句话…

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。