分数模

时间:2018-12-01 17:22:00

标签: python numpy floating-point modulo fractions

我的目标是为包含很大整数的numpy数组找到np.mod(np.array[int], some_number)。 Some_number是有理数,但通常不是精确的十进制分数。我想确保模数尽可能准确,因为我需要在以后的步骤中对直方图的结果进行分箱,因此,由于浮点精度引起的任何错误都可能意味着值最终将在错误的分箱中。 / p>

我知道带浮点数的模函数受浮点精度的限制,因此我犹豫使用np.mod(array[int], float)。 然后,我遇到了python库的分数模块。有人可以建议通过np.mod(np.array[int], Fraction(int1, int2))获得的结果是否比使用浮点数更准确?如果没有,那么解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

所以您的分数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。