Моя цель - найти np.mod(np.array[int], some_number)
для массива numpy, содержащего очень большие целые числа. Some_number является рациональным, но в целом не является точной десятичной дробью. Я хочу удостовериться, что модулю настолько точны, насколько это возможно, так как мне нужно выровнять результаты для гистограммы на более позднем этапе, поэтому любые ошибки из-за точности с плавающей запятой могут означать, что значения будут попадать в неправильный бит.
Я знаю, что функция modulo с float ограничена точностью с плавающей точкой, поэтому я не np.mod(array[int], float)
использовать np.mod(array[int], float)
. Затем я наткнулся на модуль фракций библиотеки python. Может ли кто-нибудь дать совет относительно того, будут ли результаты, полученные с помощью np.mod(np.array[int], Fraction(int1, int2))
более точными, чем использование float? Если нет, каков наилучший подход для такой проблемы?
Итак, у вас есть доля some_number=n/d
Вычисление по модулю похоже на выполнение этого разделения:
a = q*(n/d) + (r/d)
остаток - это дробь с числителем r
. Это можно сделать так:
a*d = q * n + r
Проблема в том, что a*d
может переполняться. Но проблему можно написать так:
a = q1 * n + r1
d = q2 * n + r2
a*d = (q1*q2*n+q1*r2+q2*r1) * n + (r1*r2)
что n/d находится между 10 и 100, n> d, q2 = 0, r2 = d, алгоритм
Если это для ввода в бункеры, вам не нужен шаг 3.
a*d
с евклидовым делением, 2) умножаем разложения (q1 * n + r1)*(q2 * n + r2)
3) видим, что это произведение можно записать как-то someting*n + (r1*r2)
4) r1<n
и r2 < n
но r1*r2
может быть> = n, поэтому мы выполняем другое деление, чтобы получить a*d
по модулю n: (r1*r2)%n
np.uint64
. У вас есть массив dtypedtype('O')
?