Как я могу контролировать преобразование из пользовательского объекта в numpy.longdouble? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть собственный класс, который (по историческим причинам) хранит высокоточные числа в виде двух целых чисел, представляющих целочисленную часть и нецелую часть нано-точности, например:

class Custom(object):
    def __init__(self, int_, nano_):
        self._int = int_
        self._nano = nano_

    def __float__(self):
        return self._int + self._nano * 1e-9

    def __int__(self):
        return self._int

Однако, когдаЯ пытаюсь преобразовать это в numpy.longdouble это происходит с помощью метода __float__:

>>> a = Custom(1234567890, 123456789)
>>> print(numpy.longdouble(a))
1234567890.1234567165
>>> print(numpy.longdouble(float(a)))
1234567890.1234567165
>>> print(numpy.longdouble(a._int) + numpy.longdouble(a._nano * 1e-9))
1234567890.123456789

В последнем примере есть результат, который я хочу.Итак, вопрос в том, как я могу переопределить стандартное поведение приведения к numpy.longdouble?

1 Ответ

0 голосов
/ 06 июня 2018

Я не думаю, что пока это выполнимо, поскольку промежуточное float приведение неизбежно (подробности см. в этом выпуске ).В то время как float тип не может сохранить точность такого длинного десятичного знака (проверьте представление float для деталей).

Один из способов обойти это "переопределить" функцию numpy.longdouble:

class Custom(object):
    def __init__(self, int_, nano_):
        self._int = int_
        self._nano = nano_

    def __float__(self):
        return self._int + self._nano * 1e-9

    def longdouble(self):
        return numpy.longdouble(a._int) + numpy.longdouble(a._nano * 1e-9)

    def __int__(self):
        return self._int

a = Custom(1234567890, 123456789)
print(a.longdouble())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...