Por exemplo,
int result;
result = 125/100;
ou
result = 43/100;
O resultado será sempre o piso da divisão? Qual é o comportamento definido?
"I just throw the dam fraction part in the trash and move on with life"
Por exemplo,
int result;
result = 125/100;
ou
result = 43/100;
O resultado será sempre o piso da divisão? Qual é o comportamento definido?
"I just throw the dam fraction part in the trash and move on with life"
Respostas:
O resultado será sempre o piso da divisão? Qual é o comportamento definido?
Sim, quociente inteiro dos dois operandos.
6.5.5 Operadores multiplicativos
6 Quando números inteiros são divididos, o resultado do operador / é o quociente algébrico com qualquer parte fracionária descartada. 88) Se o quociente a / b for representável, a expressão (a / b) * b + a% b será igual a.
e a nota de rodapé correspondente:
88) Isso geralmente é chamado de truncamento em direção a zero.
É claro que dois pontos a serem observados são:
3 As conversões aritméticas comuns são realizadas nos operandos.
e:
5 O resultado do operador / é o quociente da divisão do primeiro operando pelo segundo; o resultado do operador% é o restante. Nas duas operações, se o valor do segundo operando for zero, o comportamento será indefinido.
[Nota: ênfase minha]
(a / b) * b + a % b == a
tinha que ser satisfeito, e o valor absoluto de a % b
tinha que ser menor que a
, mas se a % b
era negativo para negativo a
ou b
não era especificado.
Dirkgently fornece uma excelente descrição da divisão inteira no C99, mas você também deve saber que na C89 a divisão inteira com um operando negativo tem uma direção definida pela implementação.
Do rascunho ANSI C (3.3.5):
Se um dos operandos for negativo, se o resultado do operador / é o maior inteiro menor que o quociente algébrico ou o menor inteiro maior que o quociente algébrico é definido pela implementação, como é o sinal do resultado do operador%. Se o quociente a / b for representável, a expressão (a / b) * b + a% b será igual a.
Portanto, tenha cuidado com números negativos quando estiver preso a um compilador C89.
É um fato divertido que o C99 tenha escolhido o truncamento para zero, porque foi assim que a FORTRAN fez isso. Veja esta mensagem em comp.std.c.
reliable integer division
como um novo recurso de idioma. Incrível *-*
.
expr1 / expr2
e expr1 % expr2
deve ser consistente um com o outro quando ambas as instâncias expr1
combinam os mesmos objetos da mesma maneira e da mesma forma expr2
, mas a escolha de truncar versus divisão com piso não é especificada. Isso permitiria uma geração de código mais eficiente sem quebrar muita compatibilidade (e as implementações podem documentar um comportamento específico, se necessário) #
Onde o resultado é negativo, C trunca para 0 em vez de para o piso - aprendi esta leitura sobre por que a divisão inteira do Python sempre aparece aqui: Por que a divisão inteira do Python flutua
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
iterado com a alteração dos valores de value
. Ele faz uma boa aproximação de número inteiro a um filtro lowpass de primeira ordem com constante de tempo k
... mas é simétrico apenas se a divisão estiver truncando e carry
obtiver valores negativos. Ambos os comportamentos de divisão são úteis de tempos em tempos.
div
for um operador de divisão com piso e factor
for ímpar, filtered += (filter+(factor div 2)) div factor
produziria um comportamento limpo e simétrico para todos os valores até INT_MAX-(factor div 2)
.
Sim, o resultado é sempre truncado para zero. Ele arredondará para o menor valor absoluto.
-5 / 2 = -2
5 / 2 = 2
Para valores assinados não assinados e não negativos, é o mesmo que piso (arredondamento para -Infinito).
O resultado será sempre o piso da divisão?
Não. O resultado varia, mas a variação ocorre apenas para valores negativos.
Qual é o comportamento definido?
Para deixar claro que o piso é arredondado para o infinito negativo, enquanto a divisão inteira é arredondada para zero (trunca)
Para valores positivos eles são os mesmos
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Para valor negativo, isso é diferente
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
Sei que as pessoas responderam sua pergunta, mas em termos leigos:
5 / 2 = 2
// como 5 e 2 são números inteiros e a divisão de números inteiros sempre trunca decimais
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// aqui 5 ou 2 ou ambos tem decimal, portanto, o quociente que você obterá será decimal.