Проблема здесь, похоже, не в том, что float128
не может обработать 1.844...e+19
, а скорее в том, что вы, вероятно, не можете добавить два числа с плавающей запятой с такими радикально разными масштабами и ожидать получения точных результатов:
In [1]: 1.8446744073709556e+19 - 1.0 == 1.8446744073709556e+19
Out[1]: True
Если вы действительно нуждаетесь в этом значении точности, лучше всего было бы использовать десятичные объекты и помещать их в массивный массив как dtype 'object':
In [1]: from decimal import Decimal
In [2]: big_num = Decimal(1.8446744073709556e+19)
In [3]: big_num # Note the slight innaccuracies due to floating point conversion
Out[3]: Decimal('18446744073709555712')
In [4]: a = np.array([Decimal(0.0), Decimal(1.0)], dtype='object')
In [5]: a[np.abs(a - big_num).argmin()]
Out[5]: Decimal('1')
Обратите внимание, что это будет НАМНОГО медленнее, чем типичные операции Numpy, потому что он должен возвращаться к Python для каждого вычисления, а не использовать собственные оптимизированные библиотеки (поскольку numpy не имеет десятичного типа).
РЕДАКТИРОВАТЬ:
Если вам не нужно это решение, и вы просто хотите знать, если ваш текущий код не будет работать, я предлагаю очень научный подход «просто попробуйте»:
fails = len(set(my_array)) == len(set(my_array - value))
Этогарантирует, что при вычитании value
и уникального числа X в my_array
вы получите уникальный результат.Это, как правило, истинный факт о вычитании, и если он терпит неудачу, то это потому, что арифметика с плавающей запятой не достаточно точна для обработки value - X
как числа, отличного от value
или X
.