¿Hay alguna diferencia entre estos:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
Según tengo entendido, ambos casos tienen el mismo resultado. ¿Hay alguna diferencia en el código compilado?
c++
c
floating-point
OgreSwamp
fuente
fuente
floor
, pero ten en cuenta que estodouble
no es parafloat
. C99 también tienefloorf
parafloat
.#include<cmath>
y usestd::floor
)bar
?Respuestas:
La conversión a un int se truncará hacia cero.
floor()
se truncará hacia el infinito negativo. Esto le dará valores diferentes sibar
fueran negativos.fuente
floor()
es la intención, es si el valor debar
es demasiado grande para caber en unint
.Como se dijo antes, para los números positivos son iguales, pero difieren para los números negativos. La regla es que int se redondea hacia 0, mientras que floor se redondea hacia infinito negativo.
Dicho esto, también hay una diferencia en el tiempo de ejecución. En mi sistema, he cronometrado que el lanzamiento es al menos 3 veces más rápido que el piso.
Tengo un código que necesita la operación de piso de un rango limitado de valores, incluidos los números negativos. Y debe ser muy eficiente, por lo que usamos la siguiente función para ello:
Por supuesto, esto fallará para valores muy grandes de x (se encontrará con algunos problemas de desbordamiento) y para valores negativos por debajo de -100000, etc. Pero lo he cronometrado para que sea al menos 3 veces más rápido que el piso, lo cual fue realmente crítico para nuestra aplicación. Tómelo con un grano de sal, pruébelo en su sistema, etc. pero vale la pena considerarlo en mi humilde opinión.
fuente
float
, nodouble
- tal vezdouble
fue su aplicación. Si está en C, asegúrese de usarfloorf()
confloat
s.SO 101, no cambie su pregunta después de que las personas hayan respondido a su pregunta, en su lugar, escriba una nueva pregunta.
¿Por qué cree que tendrán el mismo resultado?
fuente
fabs
? La pregunta era sobrefloor
. El piso de0.33333
... es0
.EDITAR: Porque la pregunta puede haber sido modificada debido a la confusión entre
fabs()
yfloor()
.Dadas las líneas de ejemplo de la pregunta original:
La diferencia es que si la barra es negativa el resultado será negativo con la primera pero positivo con la segunda. El primero se truncará a un número entero y el segundo devolverá el valor decimal completo, incluida la parte fraccionaria.
fuente
Si.
fabs
devuelve el valor absoluto de su argumento y la conversión a int provoca el truncamiento de la división (hasta el int más cercano), por lo que los resultados casi siempre serán diferentes.fuente
Hay dos diferencias principales:
Como han señalado otros, la conversión a un número entero se truncará hacia cero, mientras
floor()
que siempre se truncará hacia el infinito negativo; este es un comportamiento diferente para un operando negativo.Nadie (todavía) parece haber señalado otra diferencia: si su argumento es mayor o igual a
MAX_INT+1
(o menor que-MAX_INT-1
), la conversión a anint
resultará en la eliminación de los bits superiores (C, probablemente) o un comportamiento indefinido ( C ++ y posiblemente C). Por ejemplo, si suint
es de 32 bits, solo tendrá un bit de signo más 31 bits de datos. Entonces, usar esto con undouble
tamaño grande producirá resultados no deseados.fuente
int
desbordamiento es que el argumento sea mayor o igual aINT_MAX
+1. Simétricamente, la condición para el subdesbordamiento es que el argumento sea menor o igual aINT_MIN
-1.(int) x
es una solicitud para mantener la parte entera dex
(no hay redondeo aquí)fabs(x)
= | x | para que sea>= 0
;Ej:
(int) -3.5
devoluciones-3
;fabs(-3.5)
devoluciones3.5
;En general,
fabs (x) >= x
para todo x;x >= (int) x
Six >= 0
x < (int) x
Six < 0
fuente