Pregunta

Tratando de averiguar esta pseudo código. Se supone que el siguiente .... Sólo puedo usar enteros sin signo y firmado (o largo). División devuelve un número real sin resto. MOD devuelve un número real. Fracciones y decimales no se manejan.

INT I = 41828;
INT C = 15;
INT D = 0;

D = (I / 65535) * C;

¿Cómo manejaría una fracción (o valor decimal) en esta situación? ¿Hay una manera de utilizar valor negativo para representar el resto?

En este ejemplo de E / 65535 debería ser 0,638, sin embargo, con las limitaciones, consigo 0 con un MOD de 638. ¿Cómo puedo luego se multiplica por C para obtener la respuesta correcta?

La esperanza que tiene sentido.

MOD aquí sería en realidad volver 23707, no 638. (espero que estoy bien en ese :))

¿Fue útil?

Solución

Si se va a cambiar el orden de las operaciones en esa última línea, se llega a la respuesta número entero que está buscando (9, si mis cálculos son correctos)

D = (I * C) / 65535
/* D == 9 */

Es que la respuesta que está buscando?

Otros consejos

Bueno, una manera de decimales mango es esta función de división de reemplazo. Hay numerosas desventajas obvias a esta técnica.

ALT DIV (dividend, divisor) returns (decimal, point)
for point = 0 to 99
  if dividend mod divisor = 0 return dividend / divisor, point
  dividend = divident * 10
return dividend / divisor, 100

Suponiendo que estos son los valores que siempre estás utilizando para este cálculo, entonces me gustaría hacer algo como:

 D = I / (65535 / C);

o

 D = I / 4369;

Como C es un factor de 65535. Esto ayudará a reducir la posibilidad de overruning la gama disponible de números enteros (es decir, si sólo tienes 16 bits enteros sin signo).

En el caso más general, si usted piensa que hay un riesgo de que la multiplicación de I y C dará lugar a un valor fuera del rango permitido de tipo entero que estés utilizando (aunque el resultado final será dentro de ese gama) se puede factorizar el GCD del numerador y el denominador como en:

INT I = 41828; 
INT C = 15; 
INT DEN = 65535;

INT GCDI = GCD(I, DEN);
DEN = DEN / GCDI;
I = I / GCDI;

INT GCDC = GCD(C, DEN);
DEN = DEN / GCDC;
C = C / GCDC;

INT D = (I * C) / DEN;

Cuando DEN es su denominador (65.535 en este caso). Esto no le dará la respuesta correcta en todos los casos, especialmente si I y C son primos entre sí, tanto a DEN y yo * C> MAX_INT.

En cuanto a la cuestión más amplia se eleva, la división de valores enteros siempre va a perder el componente decimal (equivalente a la función del piso). La única manera de conservar la información contenida en lo que pensamos que es la parte de "decimal" es a través del resto que se puede derivar a partir del módulo. Yo le animo a no mezclar los significados de estos diferentes sistemas numéricos. Los enteros son sólo eso enteros. Si se necesita que sean números de punto flotante, debe ser realmente el uso de flotadores, no enteros. Si todo lo que está interesado en hacer es mostrar la parte decimal al usuario (es decir, usted no está realmente usarlo para realizar cálculos) entonces se podría escribir una rutina para convertir el resto en una cadena de caracteres que representa el resto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top