Как ввести число с плавающей запятой в виде строки символов «0» и «1» с помощью пакета bitstring?

Я хочу использовать пакеты bitstring и mpmath (или любой другой способ гарантировать произвольно установленную точность вывода и указанный режим округления) для вычисления значений rcp, sqrt, sin, cos, ln, exp,... на входах с плавающей запятой, заданных как двоичные bitstrings и получить двоичный ответ bitstring.

Я предпочитаю MPFR на C, но я хочу изучить высокоточные пакеты Python с плавающей запятой, надеясь на более простое обращение. Моя первая проблема заключается в том, как обратить следующее десятичное преобразование с плавающей запятой в bitstring:

>>> from bitstring import *
>>> a = BitArray(float=1.2,length=32)
>>> a.bin
'00111111100110011001100110011010'

то есть как передать '00111111100110011001100110011010' либо bitstring, либо mpmath таким образом, чтобы он интерпретировал его как (чуть выше) 1.2, а затем передать это такой функции, как sin, cos или ln (снова превращая мой ответ в bitstring).

Мне трудно узнать о двоичном вводе из документации Python bitstring/mpmath. Это говорит только о трудностях представления десятичных чисел с плавающей запятой, но не о том, как их обойти, просто вводя точные двоичные числа с плавающей запятой.


person Max Freiburghaus    schedule 15.06.2017    source источник


Ответы (2)


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
person Artyer    schedule 15.06.2017

Согласно 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
>>> 
person falsetru    schedule 15.06.2017