En el análisis numérico , se pueden utilizar uno o más dígitos de protección para reducir la cantidad de error de redondeo .
Supongamos que el resultado final de un cálculo largo de varios pasos se puede redondear con seguridad a N decimales. Es decir, el error de redondeo introducido por este redondeo final hace una contribución insignificante a la incertidumbre general.
Sin embargo, es muy probable que no sea seguro redondear los pasos intermedios del cálculo a la misma cantidad de dígitos. Tenga en cuenta que los errores de redondeo pueden acumularse. Si se utilizan M decimales en el cálculo intermedio, decimos que hay M−N dígitos de guarda.
Los dígitos de protección también se utilizan en operaciones de punto flotante en la mayoría de los sistemas informáticos.
Como ejemplo, considere la resta . Aquí, la notación del producto indica una representación binaria de punto flotante con el exponente de la representación dado como una potencia de dos y con la mantisa dada con tres bits después del punto binario. Para calcular la resta es necesario cambiar las formas de estos números para que tengan el mismo exponente, y para que cuando se expanda la notación del producto los números resultantes tengan sus puntos binarios alineados entre sí. Al cambiar el segundo operando a la posición , como , se le da un cuarto dígito después del punto binario. Esto crea la necesidad de agregar un dígito adicional al primer operando, un dígito de guarda, poniendo la resta en la forma .
Realizando esta operación se obtiene como resultado o .
Sin utilizar un dígito de guarda, la resta se realizaría con solo tres bits de precisión, como , lo que daría como resultado o , el doble del valor correcto. Por lo tanto, en este ejemplo, el uso de un dígito de guarda condujo a un resultado más preciso.
Un ejemplo del error causado por el redondeo de punto flotante se ilustra en el siguiente código C.
int principal (){ doble a ; int i ; a = 0,2 ; a + = 0,1 ; a - = 0,3 ; para ( i = 0 ; a < 1.0 ; i ++ ) a += a ; printf ( "i=%d, a=%f \n " , i , a ); devuelve 0 ; }
Parece que el programa no debería terminar. Sin embargo, el resultado es:
i=54, a=1.000000
Otro ejemplo es:
Tome dos números:
y
Elevamos el primer número a la misma potencia que el segundo:
La suma de los dos números es:
0,0256*10^22,3400*10^2 + ____________2,3656*10^2
Después de rellenar el segundo número (es decir, ) con dos s, el bit que sigue es el dígito de guarda y el bit que sigue es el dígito de redondeo. El resultado después del redondeo es opuesto a , sin los bits adicionales (bits de guarda y de redondeo), es decir, considerando solo . Por lo tanto, el error es .