如何使用 bitstring 包将浮点数输入为“0”和“1”字符的字符串?
How to input a float as a string of '0' and '1' characters with the bitstring package?
我想使用包 bitstring
和 mpmath
(或任何其他方式来保证任意设置的输出精度和指定的舍入模式)来计算 rcp
、sqrt
、sin
、co
s、ln
、exp
、...在以二进制 bitstring
s 给出的浮点输入上并获得二进制 bitstring
回答。
我的目标是 C 中的 MPFR,但我想探索 Python 的浮点高精度包,希望更容易处理。我的第一个问题是如何将以下十进制浮点数反转为 bitstring
转换:
>>> from bitstring import *
>>> a = BitArray(float=1.2,length=32)
>>> a.bin
'00111111100110011001100110011010'
即如何以一种将 '00111111100110011001100110011010'
解释为(刚好超过)1.2
的方式将 '00111111100110011001100110011010'
提供给 bitstring
或 mpmath
,然后将其提供给函数 [=15] =]、cos
或 ln
(再次将我的答案变成 bitstring
)。
我发现很难从 Python bitstring
/mpmath
文档中了解二进制 input。它只说了十进制浮点数表示的困难,但没有说如何绕过这些简单地输入精确的二进制浮点数。
根据BitArray
文档字符串,您可以指定bin
参数:
__init__(self, auto=None, length=None, offset=None, **kwargs)
Either specify an 'auto' initialiser:
auto -- a string of comma separated tokens, an integer, a file object,
a bytearray, a boolean iterable or another bitstring.
Or initialise via **kwargs with one (and only one) of:
bytes -- raw data as a string, for example read from a binary file.
bin -- binary string representation, e.g. '0b001010'. <--------------
hex -- hexadecimal string representation, e.g. '0x2ef'
oct -- octal string representation, e.g. '0o777'.
uint -- an unsigned integer.
int -- a signed integer.
float -- a floating point number.
uintbe -- an unsigned big-endian whole byte integer.
intbe -- a signed big-endian whole byte integer.
floatbe - a big-endian floating point number.
uintle -- an unsigned little-endian whole byte integer.
intle -- a signed little-endian whole byte integer.
floatle -- a little-endian floating point number.
uintne -- an unsigned native-endian whole byte integer.
intne -- a signed native-endian whole byte integer.
floatne -- a native-endian floating point number.
se -- a signed exponential-Golomb code.
ue -- an unsigned exponential-Golomb code.
sie -- a signed interleaved exponential-Golomb code.
uie -- an unsigned interleaved exponential-Golomb code.
bool -- a boolean (True or False).
filename -- a file which will be opened in binary read-only mode.
Other keyword arguments:
length -- length of the bitstring in bits, if needed and appropriate.
It must be supplied for all integer and float initialisers.
offset -- bit offset to the data. These offset bits are
ignored and this is intended for use when
initialising using 'bytes' or 'filename'.
>>> a = BitArray(bin='00111111100110011001100110011010')
>>> a.bin
'00111111100110011001100110011010'
使用float
属性得到浮点值:
>>> a.float
1.2000000476837158
>>>
BitArray
采用 bin
参数,该参数从二进制字符串表示形式对其进行初始化:
>>> from bitstring import *
>>> a = BitArray(float=1.2, length=32)
>>> a.bin
'00111111100110011001100110011010'
>>> b = BitArray(bin=a.bin)
>>> b.float
1.2000000476837158
所以一个通用函数可以做到这一点:
def float_from_bitstring(bitstring):
return BitArray(bin=bitstring).float
我想使用包 bitstring
和 mpmath
(或任何其他方式来保证任意设置的输出精度和指定的舍入模式)来计算 rcp
、sqrt
、sin
、co
s、ln
、exp
、...在以二进制 bitstring
s 给出的浮点输入上并获得二进制 bitstring
回答。
我的目标是 C 中的 MPFR,但我想探索 Python 的浮点高精度包,希望更容易处理。我的第一个问题是如何将以下十进制浮点数反转为 bitstring
转换:
>>> from bitstring import *
>>> a = BitArray(float=1.2,length=32)
>>> a.bin
'00111111100110011001100110011010'
即如何以一种将 '00111111100110011001100110011010'
解释为(刚好超过)1.2
的方式将 '00111111100110011001100110011010'
提供给 bitstring
或 mpmath
,然后将其提供给函数 [=15] =]、cos
或 ln
(再次将我的答案变成 bitstring
)。
我发现很难从 Python bitstring
/mpmath
文档中了解二进制 input。它只说了十进制浮点数表示的困难,但没有说如何绕过这些简单地输入精确的二进制浮点数。
根据BitArray
文档字符串,您可以指定bin
参数:
__init__(self, auto=None, length=None, offset=None, **kwargs)
Either specify an 'auto' initialiser:
auto -- a string of comma separated tokens, an integer, a file object,
a bytearray, a boolean iterable or another bitstring.
Or initialise via **kwargs with one (and only one) of:
bytes -- raw data as a string, for example read from a binary file.
bin -- binary string representation, e.g. '0b001010'. <--------------
hex -- hexadecimal string representation, e.g. '0x2ef'
oct -- octal string representation, e.g. '0o777'.
uint -- an unsigned integer.
int -- a signed integer.
float -- a floating point number.
uintbe -- an unsigned big-endian whole byte integer.
intbe -- a signed big-endian whole byte integer.
floatbe - a big-endian floating point number.
uintle -- an unsigned little-endian whole byte integer.
intle -- a signed little-endian whole byte integer.
floatle -- a little-endian floating point number.
uintne -- an unsigned native-endian whole byte integer.
intne -- a signed native-endian whole byte integer.
floatne -- a native-endian floating point number.
se -- a signed exponential-Golomb code.
ue -- an unsigned exponential-Golomb code.
sie -- a signed interleaved exponential-Golomb code.
uie -- an unsigned interleaved exponential-Golomb code.
bool -- a boolean (True or False).
filename -- a file which will be opened in binary read-only mode.
Other keyword arguments:
length -- length of the bitstring in bits, if needed and appropriate.
It must be supplied for all integer and float initialisers.
offset -- bit offset to the data. These offset bits are
ignored and this is intended for use when
initialising using 'bytes' or 'filename'.
>>> a = BitArray(bin='00111111100110011001100110011010')
>>> a.bin
'00111111100110011001100110011010'
使用float
属性得到浮点值:
>>> a.float
1.2000000476837158
>>>
BitArray
采用 bin
参数,该参数从二进制字符串表示形式对其进行初始化:
>>> from bitstring import *
>>> a = BitArray(float=1.2, length=32)
>>> a.bin
'00111111100110011001100110011010'
>>> b = BitArray(bin=a.bin)
>>> b.float
1.2000000476837158
所以一个通用函数可以做到这一点:
def float_from_bitstring(bitstring):
return BitArray(bin=bitstring).float