5 votos

¿Cómo estimar la cantidad de decimales necesarios para una división?

Dados dos números decimales, ¿es posible estimar la cantidad de lugares decimales necesarios para ajustar el resultado de su división? Siempre y cuando la división resulte en un número finito de decimales, por supuesto.

Por ejemplo:

  • 1234.5678 / 2 = 617.2839, se requieren 4 lugares decimales
  • 1234.5678 / 4 = 308.64195, se requieren 5 lugares decimales
  • 1234.5678 / 8 = 154.320975, se requieren 6 lugares decimales
  • 1234.5678 / 6.4 = 192.90121875, se requieren 8 lugares decimales

Por estimar, no necesariamente necesito el número exacto de decimales en el resultado, sino una cantidad de decimales igual o mayor a la cantidad requerida, para garantizar que el resultado encaje.


Lo que he intentado

Logré resolver mi problema de forma aproximada utilizando números racionales y factorización prima, pero es muy costoso en términos de cálculo. Estos son los pasos:

  • Tomar la división original: 1234.5678 / 6.4
  • Convertirlo a un número racional: 12345678 / 64000
  • Simplificar esta fracción usando el MCD de los dos números: 6172839 / 32000
  • Tomar el denominador: 32000
  • Calcular los factores de 2 y 5 dividiendo sucesivamente por estos dos números:
    32000\= 28 * 53
  • (si se encuentra en este paso que el número tiene otros factores además de 2 y 5, entonces detenerse aquí: la división resulta en un número infinito de dígitos)
  • Tomar el máximo de los dos exponentes: max(8,3) = 8
  • 8 lugares decimales son suficientes para que el resultado de la división encaje.

Cómo llegué a la conclusión anterior

De todos los números primos, solo dividir por 2 y 5 resulta en un número finito de dígitos.

Cada división por 10 añade una cifra más al número decimal. Cada combinación de 2 y 5 resulta en un 10, por lo tanto, un dígito adicional.

En 2x * 5y, hay min(x,y) veces 10.

Ahora cada división por 2 o 5 puede potencialmente (aunque no siempre) requerir un dígito extra. Por lo tanto, agregaré cuidadosamente un dígito extra por cada factor restante de 2 o 5:

Número máximo de dígitos requeridos = min(x,y) + (x - min(x,y)) + (y - min(x,y))

Lo cual se simplifica a: x + y - min(x,y)

Lo cual se puede simplificar más a max(x,y).


Siento que mi enfoque, aunque funciona, es demasiado complejo. La consecuencia directa en mi software es la lentitud del algoritmo.

¿Existe un enfoque más directo para estimar la cantidad de lugares decimales necesarios para que el resultado de la división encaje?

Tenga en cuenta que he leído esta pregunta: Número de lugares decimales a considerar en una división pero no me ha ayudado.

2 votos

No creo que haya una forma más sencilla. Buen trabajo sin embargo.

0 votos

No veo por qué piensas que tu algoritmo es demasiado complejo. ¿En qué contexto es demasiado lento?

0 votos

@RobArthan Involucra calcular el MCD, lo cual es un algoritmo recursivo que requiere calcular varias veces el resto de una división; luego descomponer en factores 2 y 5, lo cual requiere nuevamente un número de divisiones que depende del tamaño del número. ¡Esas son muchas divisiones para calcular la escala del resultado de una sola división! Especialmente para una biblioteca de números de tamaño arbitrario.

1voto

siefca Puntos 101

¿Has intentado calcular la máxima precisión necesaria para reservar un lugar para el resultado?

Mira cómo lo hace BigDecimal en Java:

https://github.com/frohoff/jdk8u-dev-jdk/blob/da0da73ab82ed714dc5be94acd2f0d00fbdfe2e9/src/share/classes/java/math/BigDecimal.java#L1674

Luego, los números no terminantes causarán un desbordamiento de esta área, así que simplemente verifica este caso límite durante el cálculo y si eso sucede, puedes estar seguro de que no se puede expresar con precisión como número decimal.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X