gmpy2:如何跟踪mpc操作的精度?

时间:2012-07-29 11:06:27

标签: python math precision gmp

假设我有两个gmpy2.mpc个对象xy精确到p位。当我计算x+y时,x和y的某些部分可能会被取消,所以我的精度会降低。

例如

from gmpy2 import *

x = mpc('-0.55555')
y = mpc('0.5555500000001')
print(x+y)

即使xy精确到〜15,结果仍然只有4个有效数字。

我想我需要弄清楚当我进行加法和减法时会发生多少次取消,然后将其从xy的最小精度中取出。对于乘法和除法,我想我最多只会失去1位精度。

所以问题很普遍:如何跟踪mpc个对象的精度,特别是在添加和减去它们时?

1 个答案:

答案 0 :(得分:2)

以下函数将返回两个mpfr个对象的匹配位数。

import gmpy2

def matching_bits(x, y):
    '''Returns the number of bits that match between x and y. The
    sign of x and y are ignored. x and y must be of type mpfr.'''

    # Force both values to be positive, and x >= y.
    x = abs(x)
    y = abs(y)
    if x < y:
        x, y = y, x

    if not isinstance(x, type(gmpy2.mpfr(0))) or not isinstance(y, type(gmpy2.mpfr(0))):
        raise TypeError("Arguments must be of type 'mpfr'.")

    x_bits, x_exp, x_prec = x.digits(2)
    y_bits, y_exp, y_prec = y.digits(2)

    # (x_exp - y_exp) is the number of zeros that must be prepended
    # to x to align the mantissas. If that is greater than the precision
    # y, then no bits in common.
    if (x_exp - y_exp) > x_prec:
        return 0

    x_bits = "0" * (x_exp - y_exp) + x_bits

    count = 0
    while count < min(x_prec, y_prec) and x_bits[count] == y_bits[count]:
        count += 1
    return count

我没有对此功能进行过广泛测试,但它应该给你一个开始。您需要分别检查实部和虚部。您可能希望修改它以检查符号以及您是否正在执行加法与减法。