Por ejemplo,
int result;
result = 125/100;
o
result = 43/100;
¿El resultado será siempre el piso de la división? ¿Cuál es el comportamiento definido?
"I just throw the dam fraction part in the trash and move on with life"
Por ejemplo,
int result;
result = 125/100;
o
result = 43/100;
¿El resultado será siempre el piso de la división? ¿Cuál es el comportamiento definido?
"I just throw the dam fraction part in the trash and move on with life"
Respuestas:
¿El resultado será siempre el piso de la división? ¿Cuál es el comportamiento definido?
Sí, cociente entero de los dos operandos.
6.5.5 Operadores multiplicativos
6 Cuando se dividen los enteros, el resultado del operador / es el cociente algebraico con cualquier parte fraccional descartada. 88) Si el cociente a / b es representable, la expresión (a / b) * b + a% b será igual a a.
y la nota al pie correspondiente:
88) Esto a menudo se llama "truncamiento hacia cero".
Por supuesto, dos puntos a tener en cuenta son:
3 Las conversiones aritméticas habituales se realizan en los operandos.
y:
5 El resultado del operador / es el cociente de la división del primer operando por el segundo; El resultado del% operador es el resto. En ambas operaciones, si el valor del segundo operando es cero, el comportamiento es indefinido.
[Nota: el énfasis es mío]
(a / b) * b + a % b == a
tenía que satisfacerse, y el valor absoluto de a % b
tenía que ser menor que a
, pero si a % b
era negativo para negativo a
o b
no se especificaba.
Dirkgently da una excelente descripción de la división de enteros en C99, pero también debe saber que en C89 la división de enteros con un operando negativo tiene una dirección definida por la implementación.
Del borrador ANSI C (3.3.5):
Si cualquiera de los operandos es negativo, si el resultado del operador / es el entero más grande menor que el cociente algebraico o el entero más pequeño mayor que el cociente algebraico está definido por la implementación, como lo es el signo del resultado del operador%. Si el cociente a / b es representable, la expresión (a / b) * b + a% b será igual a a.
Así que ten cuidado con los números negativos cuando estás atascado con un compilador C89.
Es un hecho divertido que C99 eligió el truncamiento hacia cero porque así fue como FORTRAN lo hizo. Ver este mensaje en comp.std.c.
reliable integer division
como una nueva característica de lenguaje. Increíble *-*
.
expr1 / expr2
y expr1 % expr2
debe ser coherente entre sí cuando ambas instancias expr1
combinan los mismos objetos de la misma manera, y de la misma manera paraexpr2
, pero la elección de la división truncada en comparación con el piso no está especificada. Eso habría permitido una generación de código más eficiente sin romper mucha compatibilidad (y las implementaciones podrían documentar un comportamiento específico si está inclinado)
Donde el resultado es negativo, C se trunca hacia 0 en lugar de piso: aprendí esta lectura sobre por qué la división entera de Python siempre toca piso aquí: por qué los pisos de división entera de Python
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
iterado con valores cambiantes de value
. Hace una buena aproximación entera a un filtro de paso bajo de primer orden con constante de tiempo k
... pero solo es simétrico si la división se trunca y carry
obtiene valores negativos. Ambos comportamientos para la división son útiles de vez en cuando.
div
es un operador de división con piso y factor
es extraño, filtered += (filter+(factor div 2)) div factor
produciría un comportamiento limpio y simétrico para todos los valores hasta INT_MAX-(factor div 2)
.
Sí, el resultado siempre se trunca hacia cero. Se redondeará hacia el valor absoluto más pequeño.
-5 / 2 = -2
5 / 2 = 2
Para valores con signo sin signo y sin signo negativo, esto es lo mismo que floor (redondeando hacia -Infinity).
¿El resultado será siempre el piso de la división?
No. El resultado varía, pero la variación ocurre solo para valores negativos.
¿Cuál es el comportamiento definido?
Para que quede claro, el piso se redondea hacia el infinito negativo, mientras que la división entera se redondea hacia cero (trunca)
Para valores positivos son iguales
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Para valor negativo esto es diferente
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
Sé que la gente ha respondido tu pregunta, pero en términos simples:
5 / 2 = 2
// ya que 5 y 2 son enteros y la división de enteros siempre trunca los decimales
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// aquí 5 o 2 o ambos tienen decimal, por lo tanto, el cociente que obtendrás estará en decimal.