Ver Mensaje Individual
  #13  
Antiguo 14-09-2010
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 25
Delphius Va camino a la fama
Cita:
Empezado por rrf Ver Mensaje
Hola a todos/as.

Lo normal en todas las funciones que he visto (incluidas las que he revisado en este hilo) es que, para redondear a 3 decimales, se utilizan 4 decimales y, en este ejemplo (el valor 0.75444448), el redondeo daría 0.754 .
Efectivamente, el redondeo se aplica según el valor del dígito siguiente. Es decir que si se desea redondear el valor a 3 decimales, este último decimal se verá afectado según el valor del 4to decimal. Por ejemplo, siguiendo tu caso:

0.75444448

El 4 en negrita es el número a redondear. El 4 subrayado es el dígito a evaluar con el modo de redondeo. Dependiendo del modo se verá afectado hacia arriba, abajo, trunca, etc. Fuera del modo, todo se resume a 3 posibilidades para ese 4: Se "convierte" en 3, 4 o 5.

Así es que se aplica el redondeo. La última cifra significativa de interés al redondeo se ve afectada por la siguiente.

Cita:
Empezado por rrf Ver Mensaje
Hola a todos/as.
(...)pero que no aprovecha la totalidad de decimales disponibles.

Si se aprovecharan todos los decimales para redondear, el valor final debería dar 0.755 .
Ese criterio de redondeo no lo veo demasiado exacto y de utilidad. Es un redondeo fuera de lo normal. Me cuesta ver cómo de 0.75444448 se puede llegar a ese resultado.

Cita:
Empezado por rrf Ver Mensaje
Todo ello redondeando con:
Código Delphi [-]SetRoundMode( rmUp ) ;



Recuerda volver al modo de redondeo anterior, de otro modo todos tus cálculos se verán afectados (inflados) y el error tras unas cuantas operaciones será mayor del que te esperas.

Cita:
Empezado por rrf Ver Mensaje
Como el tema no se resuelve en las funciones de otras personas que he visto, me he animado a hacer una función en la que se indique lo que es normal, el valor decimal y el número de decimales a los cuales hay que redondear; pero añadiendo otro parámetro: el número de decimales desde el que se empieza a redondear de forma decreciente.

En el ejemplo, el valor 9.97444756, se redondea a 3 decimales y se empieza a calcular el redondeo desde los 7 decimales (luego se hará con 6, luego con 5, ... hasta que se llegue a 3).
Déjame ver si entendí... ¿Es decir empiezas a redondear cada dígito significativo hasta llegar a los decimales a considerar?

De ser así, disculpame pero creo que no es una buena idea, porque de ese modo se está incrementando el error tras cada avance. Todo comienza con un error de 0.5 ulp, después de moverse al nuevo dígito será de un máximo de 0.5 + 10, luego 0.5 + 10 + 100... y así se irá propagando hasta llegar al dígito en cuestión.
Esto en términos absolutos.

Imagínate que luego a ese resultado debes aplicar la siguiente operación:

Valor2 = Valor1 x 10000;

Hagamos de cuenta, como dices que debería ser 0.755 y no 0.745. Si hacemos dicha multiplicación se obtiene 7550 y 7450. La diferencia entre ambos es de 100, ahora multiplícalo por 100000... 75500 y 74500, diferencia: 1000.

Cuanto más sigas avanzando, más alta será la diferencia, los cálculos se harán más erróneos.

No he probado tu código. Pero si hace lo que me temo, creo que no es buen método de redondeo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita