Solo me pregunto, si quiero dividir a por b, y estoy interesado tanto en el resultado c como en el resto (por ejemplo, digo que tengo un número de segundos y quiero dividirlo en minutos y segundos), ¿cuál es la mejor manera de hacerlo?
Podría ser
int c = (int)a / b;
int d = a % b;
o
int c = (int)a / b;
int d = a - b * c;
o
double tmp = a / b;
int c = (int)tmp;
int d = (int)(0.5+(tmp-c)*b);
o
tal vez hay una función mágica que le da a uno a la vez?
double
(su último elemento) me parece una mala idea, terminará con números que no se alinean y pueden costarle rendimiento y tamaño ejecutable (siempre fue un problema para mí en ciertos sistemas integrados).Respuestas:
En x86, el resto es un subproducto de la división en sí, por lo que cualquier compilador medio decente debería poder usarlo (y no
div
volver a realizarlo ). Probablemente esto también se haga en otras arquitecturas.fuente
idivl
instrucción y usando los resultados en eax y edx. Me habría sorprendido si no fuera así.idivl
instrucciones, pero con-O1
o más, obtienes una. Como dice el manual, “Sin ninguna opción de optimización… las declaraciones son independientes” .std::div
devuelve una estructura con resultado y resto.fuente
long long
, pero es muy probable que su compilador tenga unalong long
sobrecargastd::div
como extensión.En x86 al menos, g ++ 4.6.1 solo usa IDIVL y obtiene ambos de esa única instrucción.
Código C ++:
código x86:
fuente
/=
, es posible que deba usar una variable temporal para mantener la división primero.Ejemplo de prueba de código div () y división y mod combinados. Los compilé con gcc -O3, tuve que agregar la llamada a doNothing para evitar que el compilador optimizara todo (la salida sería 0 para la solución division + mod).
Tómelo con un grano de sal:
Salidas: 150
Salidas: 25
fuente
Además de la familia de funciones std :: div antes mencionada , también existe la familia de funciones std :: remquo , devolver el rem -ainder y obtener el quo -tient a través de un puntero pasado.
[Editar:] Parece que std :: remquo realmente no devuelve el cociente después de todo.
fuente
En igualdad de condiciones, la mejor solución es aquella que exprese claramente su intención. Entonces:
es probablemente la mejor de las tres opciones que presentó. Sin embargo, como se señaló en otras respuestas, el
div
método calculará ambos valores a la vez.fuente
No puede confiar en g ++ 4.6.3 aquí con enteros de 64 bits en una plataforma Intel de 32 bits. a / b se calcula mediante una llamada a divdi3 y a% b se calcula mediante una llamada a moddi3. Incluso puedo ofrecer un ejemplo que calcule a / by ab * (a / b) con estas llamadas. Entonces uso c = a / by ab * c.
El método div da una llamada a una función que calcula la estructura div, pero una llamada de función parece ineficaz en plataformas que tienen soporte de hardware para el tipo integral (es decir, enteros de 64 bits en plataformas Intel / amd de 64 bits).
fuente
Puede usar un módulo para obtener el resto. Aunque la respuesta de @cnicutar parece más limpia / más directa.
fuente