Existe alguma diferença entre estes:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
Pelo que entendi, ambos os casos têm o mesmo resultado. Existe alguma diferença no código compilado?
c++
c
floating-point
OgreSwamp
fonte
fonte
floor
, mas cuidado, pois issodouble
não é parafloat
. C99 também temfloorf
parafloat
.#include<cmath>
e usestd::floor
)bar
?Respostas:
A conversão para um int truncará em direção a zero.
floor()
irá truncar em direção ao infinito negativo. Isso fornecerá valores diferentes sebar
forem negativos.fonte
floor()
for a intenção, é se o valor debar
é muito grande para caber emint
.Como foi dito antes, para números positivos eles são iguais, mas diferem para números negativos. A regra é que int arredonda para 0, enquanto floor arredonda para infinito negativo.
Dito isso, também há uma diferença no tempo de execução. No meu sistema, eu calculei que a fundição é pelo menos 3 vezes mais rápida do que o chão.
Tenho um código que precisa da operação de piso de uma faixa limitada de valores, incluindo números negativos. E precisa ser muito eficiente, então usamos a seguinte função para isso:
É claro que isso falhará para valores muito grandes de x (você terá alguns problemas de estouro) e para valores negativos abaixo de -100000, etc. para nosso aplicativo. Tome-o com um grão de sal, teste-o em seu sistema, etc. mas vale a pena considerar IMHO.
fonte
float
, nãodouble
- talvezdouble
fosse sua aplicação. Se em C, certifique-se de usarfloorf()
comfloat
s.SO 101, não mude sua pergunta depois que as pessoas responderem à sua pergunta, em vez disso, escreva uma nova pergunta.
Por que você acha que eles terão o mesmo resultado?
fonte
fabs
? A questão era sobrefloor
. O chão de0.33333
... é0
.EDIT: Porque a pergunta pode ter sido modificada devido à confusão entre
fabs()
efloor()
.Dadas as linhas de exemplo da pergunta original:
A diferença é que se a barra for negativa, o resultado será negativo com a primeira, mas positivo com a segunda. O primeiro será truncado para um número inteiro e o segundo retornará o valor decimal completo incluindo a parte fracionária.
fonte
Sim.
fabs
retorna o valor absoluto de seu argumento, e a conversão para int causa o truncamento da divisão (até o int mais próximo), portanto, os resultados quase sempre serão diferentes.fonte
Existem duas diferenças principais:
Como outros apontaram, a projeção para um inteiro truncará em direção a zero, enquanto
floor()
sempre truncará em direção ao infinito negativo; este é um comportamento diferente para um operando negativo.Ninguém (ainda) parece ter apontado outra diferença - se o seu argumento for maior ou igual a
MAX_INT+1
(ou menor que-MAX_INT-1
), então a conversão para umint
resultará na perda dos bits mais importantes (C, provavelmente) ou comportamento indefinido ( C ++ e possivelmente C). Por exemplo, se seuint
for de 32 bits, você terá apenas um bit de sinal mais 31 bits de dados. Portanto, usar isso com um dedouble
tamanho grande vai produzir resultados indesejados.fonte
int
estouro é que o argumento seja maior ou igual aINT_MAX
+1. Simetricamente, a condição para o estouro negativo é que o argumento seja menor ou igual aINT_MIN
-1.(int) x
é uma solicitação para manter a parte inteira dex
(não há arredondamento aqui)fabs(x)
= | x | de modo que é>= 0
;Ex:
(int) -3.5
retorna-3
;fabs(-3.5)
retorna3.5
;Em geral,
fabs (x) >= x
para todo x;x >= (int) x
E sex >= 0
x < (int) x
E sex < 0
fonte