По модулю с дробями. Фракционный класс - PullRequest
0 голосов
/ 01 декабря 2018

Моя цель - найти np.mod(np.array[int], some_number) для массива numpy, содержащего очень большие целые числа.Some_number рационально, но в целом не является точной десятичной дробью.Я хочу убедиться, что модули являются настолько точными, насколько это возможно, так как на следующем шаге мне нужно связать результаты для гистограммы, поэтому любые ошибки из-за точности с плавающей запятой могут означать, что значения окажутся в неправильном контейнере.

Мне известно, что функция по модулю с плавающей точкой ограничена точностью с плавающей точкой, поэтому я не решаюсь использовать np.mod(array[int], float).Затем я наткнулся на модуль фракций библиотеки Python.Может ли кто-нибудь дать совет относительно того, будут ли результаты, полученные с помощью np.mod(np.array[int], Fraction(int1, int2)), более точными, чем использование поплавка?Если нет, то как лучше всего решить эту проблему?

1 Ответ

0 голосов
/ 04 декабря 2018

Итак, у вас есть дробь 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, алгоритм равен

  1. вычислить по модулю n => r1
  2. вычислить (r1 * d) по модулю n => r
  3. разделить r на d => по модулю n / d

Если вы хотите положить мусорное ведро, вам не нужен шаг 3.

...