1

2つのgmpy2.mpcオブジェクトがxありy、pビットに正確であるとします。計算するx+yと、xとyの一部がキャンセルされる可能性があるため、精度が低下します。

例えば

from gmpy2 import *

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

結果は、有効数字が4桁まで正確でありxy15まで正確でした。

足し算と引き算をするときに何ビットのキャンセルが発生するかを計算し、これを最小xまたはyの精度から取り除く必要があると思います。掛け算と割り算の場合、せいぜい1ビットの精度しか失わないと思います。

mpcしたがって、質問は非常に一般的です。特にオブジェクトを加算および減算するときに、オブジェクトの精度を追跡するにはどうすればよいですか?

4

1 に答える 1

2

mpfr次の関数は、2つのオブジェクトの一致するビット数を返します。

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

私はこの機能を広範囲にテストしていませんが、それはあなたにスタートを与えるはずです。実数成分と虚数成分を別々にチェックする必要があります。符号をチェックし、加算と減算を実行しているかどうかを確認するために、おそらくそれを変更することをお勧めします。

于 2012-07-29T20:54:26.283 に答える