浮点数(base10)到IEEE754 32位转换器的结果错误

2024-10-01 09:39:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我对IEEE-754 32位转换器的浮点数(以10为基数)的回答是错误的,我不太确定原因是什么。这是我的代码,请原谅我混淆了变量名。我不熟悉编码。 我从这个网站上得到了这个解决方案。 https://www.wikihow.com/Convert-a-Number-from-Decimal-to-IEEE-754-Floating-Point-Representation

结果应该是:

010000100110101001000000000000

我得到的结果是:

01000010010111100100000000000

x = str(58.5625)
s = x.split(".")

a = int(s[0])
p = int(s[1])
q = "0." + str(p)
b = float(q)

front = ""
end = ""

while a > 0:
    front += str(a % 2)
    a //= 2
    a = int(a)

while b != 1 and len(end) < 17:
    b *= 2
    end += str(b)[0]
    b -= int(str(b)[0])

print(a, b)
print(front, end)

whole = front + "." + end

count = whole.find('.') - 1

ff = whole.split('.')
q1 = ff[0]
q2 = ff[1]

c = (q1 + q2)[1:]
te = float(x)
if te > 0:
    signofnum = '0'
else :
    signofnum = '1'

expobased = count + 127

exponent = ""

while expobased > 0:
    exponent += str(expobased % 2)
    expobased //= 2
    expobased = int(expobased)

exponent = exponent[::-1]

mantissa = c

result = signofnum + exponent + mantissa
print(result)

Tags: countfloatintendsplitfrontprintff
1条回答
网友
1楼 · 发布于 2024-10-01 09:39:45

你的front是向后的。循环从右到左获取位(最低/最右边的位在前,最大/最左边的位在后)并将它们附加到front上,因此最低的位先继续,然后第二个最低的位附加到其右边,依此类推,直到输入的最高位作为front的最右边位。修复该问题,以获得问题中样本值的正确结果。它可以通过将front += str(a % 2)更改为front = str(a % 2) + front来修复

此外,不要使用:

s = x.split(".")
…
p = int(s[1])

分数部分不是整数,将其转换为整数会丢失有关其位置的信息(前导零)。要得到b,分数部分,只需从原始数字中减去a(整数部分)。可能还优选获得aas int(number);根本不需要转换为字符串

相关问题 更多 >