raptor - residuo de una division en c++
Redondeo de división entera con negativos en C++ (4)
De acuerdo con la revisión de mayo de 2008,
Tienes razón:
El operador binario produce el cociente, y el operador binario% produce el resto de la división de la primera expresión por el segundo. Si el segundo operando de / o% es cero, el comportamiento no está definido; de lo contrario (a / b) * b + a% b es igual a a. Si ambos operandos son no negativos, el resto no es negativo; si no, el signo del resto está definido por la implementación75).
La nota 75 dice:
Según el trabajo en curso hacia la revisión de ISO C, el algoritmo preferido para la división de enteros sigue las reglas definidas en el estándar ISO Fortran, ISO / IEC 1539: 1991, en el que el cociente siempre se redondea hacia cero.
Lo más probable es que C ++ lag C en este sentido. Tal como está, no está definido pero tienen un ojo para cambiarlo.
Trabajo en el mismo departamento que Stroustrup y con un miembro del comité. Las cosas toman AGES para ser completadas, y son interminablemente políticas. Si parece tonto, probablemente lo sea.
Supongamos que a
y b
son ambos de tipo int
, y b
es distinto de cero. Considere el resultado de realizar a/b
en los siguientes casos:
-
b
son ambos no negativos. -
a
yb
son ambos negativos. - Exactamente uno de ellos es negativo.
En el caso 1, el resultado se redondea al número entero más cercano. Pero, ¿qué dice la norma sobre los casos 2 y 3? Un viejo borrador que encontré flotando en Internet indica que depende de la implementación (sí, incluso del caso 2), pero el comité se inclina a hacerlo siempre ''redondo hacia cero''. ¿Alguien sabe lo que dice el (último) estándar? Responda solo en función del estándar, no de lo que tenga sentido o de lo que hagan los compiladores en particular.
Como una actualización de las otras respuestas:
El último borrador de C ++ 11, n3242 , que para la mayoría de los propósitos prácticos es idéntico al estándar real C ++ 11, dice esto en 5.6 punto 4 (página 118):
Para operandos integrales, el operador / produce el cociente algebraico con cualquier parte fraccional descartada; (ver nota 80)
Nota 80 estados (tenga en cuenta que las notas no son normativas):
80) Esto a menudo se llama truncamiento hacia cero.
El punto 4 continúa diciendo:
si el cociente a / b es representable en el tipo de resultado, (a / b) * b + a% b es igual a a.
que se puede demostrar que requiere que el signo de a%b
sea el mismo que el signo de a
(cuando no es cero).
Algunas veces tenemos que dar un paso atrás, y mirar solo las matemáticas de esto:
Dado int x, int y
si int i1 = x / y y int i2 = x% y
entonces y * i1 + i2 debe ser x
Entonces, esto no se trata tanto del estándar, sino que solo hay una manera de que esto sea posible. Si cualquier estándar permite que sea de otra manera, entonces el estándar es incorrecto, y eso significa que el idioma está roto.