Тупой теряет точность при конвертации long int в float - PullRequest
0 голосов
/ 14 ноября 2018

Кажется, numpy теряет точность значений numpy.int64 при преобразовании в типы с плавающей запятой.

Моя версия numpy - 1.15.4, которая , похоже, исправляет эту ошибку .

Вот пример:

>>> value = 734625324872288246
>>> value_plus_1 = 734625324872288246 + 1
>>> items = [value, value_plus_1]
>>> value.bit_length()
60
>>> value_plus_1.bit_length()
60
>>> import numpy as np
>>> a = np.array(items, dtype = np.float128) # larger than needed for value
>>> a
array([7.34625325e+17, 7.34625325e+17], dtype=float128)
>>> a.astype(np.int64) # larger than needed for value
array([734625324872288256, 734625324872288256])
>>> np.__version__
'1.15.4'

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

У меня вопрос;Есть ли что-то, что я делаю не так, когда создаю неповоротливые массивы, которые можно исправить, чтобы не потерять точность?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

(Вопрос почти наверняка является дубликатом, но мой поиск сейчас слаб).

Существует только конечное число чисел, которые могут быть представлены 64-битными числами с плавающей запятой.Интервал между числами, которые точно представимы, зависит от величины чисел;Вы можете найти интервал с помощью функции numpy.spacing(x) для числа с плавающей запятой x.В вашем случае интервал чисел с плавающей запятой вокруг 734625324872288246 равен 128:

In [33]: x = float(734625324872288246)

In [34]: x
Out[34]: 7.346253248722883e+17

In [35]: np.spacing(x)
Out[35]: 128.0

Целочисленное значение 734625324872288246 не может быть представлено точно как число с плавающей запятой.Вы можете увидеть это, приведя число обратно к целому числу;вы не получите одно и то же значение:

In [36]: int(x)
Out[36]: 734625324872288256

Вы можете представить 734625324872288256 точно как число с плавающей запятой, но следующее нижнее представимое целое число - 734625324872288256 - 128 = 734625324872288128.

И здесьявляются обязательными ссылками на вопросы о числах с плавающей запятой:

0 голосов
/ 14 ноября 2018

Документация numy (https://docs.scipy.org/doc/numpy-1.15.0/user/basics.types.html) гласит, что реализация float64 использует только 52 бита для мантиссы и 11 бит для экспоненты. Скорее всего, этой точности недостаточно для хранения ваших 60-битных чисел с полным точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...