double
유형의 데이터를 십진수 값으로 64 비트 변환하려고합니다. 나는 변환을 위해 https://en.wikipedia.org/wiki/Double-precision_floating-point_format 을 따르고있다.십진수로의 이중 변환 IEEE-754 in Python
나는 다음과 같은 스크립트에서 시도 :
a = '\x3f\xd5\x55\x55\x55\x55\x55\x55' # Hexbyte representation of 1/3 value in double
sign_bit = bin(ord(a[0])).replace('0b', '').rjust(8, '0')[0]
sign = -1 ** int(sign_bit)
print sign # Sign bit
# Next 11 bits for exponent calculation
exp_bias = 1023
a11 = bin(ord(a[0])).replace('0b', '').rjust(8, '0')[1:] + bin(ord(a[1])).replace('0b', '').rjust(8, '0')[:4]
exp = int(a11, 2)
print exp
# Next 52 bits for fraction calculation
fraction = bin(ord(a[1])).replace('0b', '').rjust(8, '0')[4:] + bin(ord(a[2])).replace('0b', '').rjust(8, '0') \
+ bin(ord(a[3])).replace('0b', '').rjust(8, '0') + bin(ord(a[4])).replace('0b', '').rjust(8, '0') \
+ bin(ord(a[5])).replace('0b', '').rjust(8, '0') + bin(ord(a[6])).replace('0b', '').rjust(8, '0') \
+ bin(ord(a[7])).replace('0b', '').rjust(8, '0')
print len(fraction), fraction
fract = str(int(fraction, 2))
print len(fract), fract
fin = repr(float(fract)/ 10 ** 16)
print type(fin), fin # 16 digit precision
# final value calculation according equation
# eq = (-1)^sign * 2 ^(exp- exp_bias) * (1 + fin)
val = 2 ** (exp - exp_bias) * float(fin) # Looses precision
print val
는 어느 한이 좀 도와주십시오. 내가 어디 잘못 됐는지 이해할 수 없다? 왜냐하면 나는
repr()
을 사용하여 정밀도로 분수 값을 가질 수 있지만 방정식에 사용할 때마다
float()
에 정밀도가 손실됩니다.
어쨌든 또는 다른 방법으로 해결할 수 있습니까?
당신이 [이 ByteArray (https://docs.python.org/2.7/library/functions.html#bytearray) – janbrohl
문자열 작동하지 않습니다 가능한 경우만큼 사용하는 경우 코드는 훨씬 간단 할 수있다 가능하지만 정수를 사용합니다. 예 :'sign_bit = bytearray (a) [0] >> 7' 가능한 한 대부분의 float 연산에서 정밀도를 잃을 때 float을 사용하지 마십시오. – janbrohl
@janbrohl 제안 해 주셔서 감사합니다. – abhi1610