gmpy2: ¿Cómo realizo un seguimiento de la precisión de las operaciones de mpc?

Di que tengo dos gmpy2.mpc objetos x y y precisión de p bits. cuando calculo x+y puede ser que algunas partes de x e y se cancelen, por lo que me quedo con menos precisión.

Por ejemplo:

from gmpy2 import *

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

El resultado tiene una precisión de sólo 4 cifras significativas, aunque x y y fueron precisos a ~15.

Creo que necesito calcular cuántos bits de cancelación ocurren cuando hago sumas y restas y luego lo quito del mínimo de x or yprecisión de . Para la multiplicación y la división, creo que solo perderé 1 bit de precisión como máximo.

Así que la pregunta es bastante general: ¿cómo puedo hacer un seguimiento de la precisión de mpc objetos, particularmente al sumarlos y restarlos?

preguntado el 29 de julio de 12 a las 12:07

1 Respuestas

La siguiente función devolverá los números de bits coincidentes de dos mpfr objetos.

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

No he probado exhaustivamente esta función, pero debería darle un comienzo. Deberá verificar los componentes reales e imaginarios por separado. Probablemente querrá modificarlo para verificar el signo y si está realizando sumas o restas.

Respondido 29 Jul 12, 21:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.