По большей части, вас просто обманывают repr
массивов numy.
Рассмотрите приведенный выше пример:
import numpy as np
x = float(1) - np.array([1e-10, 1e-5])
print x
print x[0]
print x[0] == 1.0
Это дает:
[ 1. 0.99999 ]
0.99999999999
False
Таким образом, первый элемент на самом деле не равен нулю, это просто симпатичная печать массивов, которые показывают это таким образом.
Это может контролироваться numpy.set_printoptions
.
Конечно, numpy по своей сути использует поплавки с ограниченной точностью.Суть numpy в том, чтобы быть контейнером с эффективным использованием памяти для массивов схожих данных, поэтому в numpy нет эквивалента классу decimal
.
Однако 64-разрядные операции с плавающей точкой имеют приличный диапазон точности,Вы не столкнетесь с большим количеством проблем с 1e-10 и 1e-5.Если вам нужно, есть также numpy.float128
dtype, но операции будут намного медленнее, чем использование нативных операций с плавающей запятой.