2015-07-21 30 views
6

在倍频程中,命令format bit后面的所有数字输出将显示存储在内存中的数字的本地位表示。例如,是否有与八度命令`格式位'相当的python?

octave:1> format bit 
octave:2> 0.5 
ans = 0011111111100000000000000000000000000000000000000000000000000000 
octave:7> 2 
ans = 0100000000000000000000000000000000000000000000000000000000000000 
octave:3> format 
octave:4> 0.5 
ans = 0.50000 

是否有在python等效的命令显示所有在其天然位表示(因此输出如下所示)的数量?

>>> "equivalent of the octave format bit command" 
>>> 0.5 
0011111111100000000000000000000000000000000000000000000000000000 

(这是从二进制表示非常不同0.5。)

+1

我怀疑它; Python不鼓励知道或关心事物在内存中的存储位置和方式。你想用它做什么? – jonrsharpe

+0

相关:[Python中的float的二进制表示形式(位不是十六进制)](http://stackoverflow.com/q/16444726/953482)。这只是为了漂浮。 – Kevin

+0

@凯文感谢您的链接,但它不是我所期待的。 @jonsharpe我发现它非常方便,在教授数值分析类时,使用八度中的“格式位”来解释浮点表示法,归一化与非规格化浮点数等。但是我想开始使用python作为类,因此查询。 –

回答

5

TL; DR;不,没有Python等效物

当你使用Python时,你不应该需要这些信息。像使用八度一样设置“输出模式”是不可能的(不需要修改Python本身)。如果你真的想要所有输出的格式都不是默认的,你可以编写自定义函数,甚至可以覆盖默认的print函数,如果你使用的是Python 3.

如果你只是想看到数字的二进制表示,可以使用bin(number)函数来计算整数。对于花车,您可以使用float.hex(number)

如果我们真的想看到内部的表现,它需要一些工作,一点点黑魔法和​​库。使用Python获取这些数据并不容易(或者无法使用),但是我创建了一个函数,它向我们展示了float在内部是如何表示的:

我们知道浮点数是浮点数,因此它们使用浮点数8个字节(64位)的内存。

import ctypes 

def show_float(x): 
    asdouble = ctypes.c_double(x) 
    xpointer = ctypes.addressof(asdouble) 
    xdata = ctypes.string_at(xpointer, 8) 
    print "".join([bin(ord(i))[2:] for i in xdata]) 

x = 3.14 
show_float(x) # prints 1111110000101111010111010001101110001111010011000000 

整数更难,因为表示不是在所有实施一样的。你可以找到一个例子here

+0

我只需要这个功能来向学生展示机器表示,所以一个函数很好地服务于我的目的(当然比“修改Python”更好)。使用你的想法,我想出了完全显示出我需要的功能(张贴在下面),所以谢谢! –

+0

无关的问题:什么是TL; DR;? (对不起,我是stackoverflow的新手。) –

+0

TL; DR; '太久了;没有读' –

1

根据@Hannes Karppila的回答,这里有两个函数,它们以二进制和十六进制格式显示任意数字的机器表示。它使用与答案基本相同的逻辑,但用零填充输出以显示每个字节的“正确”长度。

import ctypes 
import decimal 
def print_as_octave_bit_hex(x): 
    ''' 
    This function prints the binary representation as it would 
    be printed using the format 'bit' and 'hex' in octave 
    ''' 
    asdouble = ctypes.c_double(x) 
    xpointer = ctypes.addressof(asdouble) 
    xdata = ctypes.string_at(xpointer, 8) 
    xbin= [(bin(i)[2:].zfill(8)) for i in xdata[-1::-1]] 
    print(x, "=", x.hex(), "=", decimal.Decimal(x)) 
    print("representation in format 'bit' and 'hex' of octave") 
    print("with spaces separating each byte") 
    print(" ".join([i.zfill(8) for i in xbin]), "=", 
     " ".join([hex(int(i,2))[2:].zfill(2) for i in xbin])) 
    print("without spaces separating the bytes") 
    print("".join([i.zfill(8) for i in xbin]), "=", 
     "".join([hex(int(i,2))[2:].zfill(2) for i in xbin])) 

def print_as_octave_native_bit_hex(x): 
    ''' 
    This function prints the binary representation as it would 
    be printed using the format 'native-bit' and 'native-hex' in octave 
    ''' 
    asdouble = ctypes.c_double(x) 
    xpointer = ctypes.addressof(asdouble) 
    xdata = ctypes.string_at(xpointer, 8) 
    xbin = [(bin(i)[2:].zfill(8)) for i in xdata] 
    print(x, "=", x.hex(), "=", decimal.Decimal(x)) 
    print("representation in format 'native-bit' and 'native-hex' of octave") 
    print("with spaces separating each byte") 
    print(" ".join([(i.zfill(8))[-1::-1] for i in xbin]), "=", 
     " ".join([hex(int(i,2))[2:].zfill(2) for i in xbin])) 
    print("without spaces separating the bytes") 
    print("".join([(i.zfill(8))[-1::-1] for i in xbin]), "=", 
     "".join([hex(int(i,2))[2:].zfill(2) for i in xbin])) 

x=1.1+2.2 
print_as_octave_bit_hex(x) 
print(" ") 
print_as_octave_native_bit_hex(x) 
3.3000000000000003 = 0x1.a666666666667p+1 = 3.300000000000000266453525910037569701671600341796875 
representation in format 'bit' and 'hex' of octave 
with spaces separating each byte 
01000000 00001010 01100110 01100110 01100110 01100110 01100110 01100111 = 40 0a 66 66 66 66 66 67 
without spaces separating the bytes 
0100000000001010011001100110011001100110011001100110011001100111 = 400a666666666667 

3.3000000000000003 = 0x1.a666666666667p+1 = 3.300000000000000266453525910037569701671600341796875 
representation in format 'native-bit' and 'native-hex' of octave 
with spaces separating each byte 
11100110 01100110 01100110 01100110 01100110 01100110 01010000 00000010 = 67 66 66 66 66 66 0a 40 
without spaces separating the bytes 
1110011001100110011001100110011001100110011001100101000000000010 = 6766666666660a40 
+0

谢谢,他们是很好的补充。 –

相关问题