¿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 estodoubleno es parafloat. C99 también tienefloorfparafloat.#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 sibarfueran negativos.fuente
floor()es la intención, es si el valor debares 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 vezdoublefue su aplicación. Si está en C, asegúrese de usarfloorf()confloats.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.
fabsdevuelve 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 anintresultará en la eliminación de los bits superiores (C, probablemente) o un comportamiento indefinido ( C ++ y posiblemente C). Por ejemplo, si suintes de 32 bits, solo tendrá un bit de signo más 31 bits de datos. Entonces, usar esto con undoubletamaño grande producirá resultados no deseados.fuente
intdesbordamiento 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) xes una solicitud para mantener la parte entera dex(no hay redondeo aquí)fabs(x)= | x | para que sea>= 0;Ej:
(int) -3.5devoluciones-3;fabs(-3.5)devoluciones3.5;En general,
fabs (x) >= xpara todo x;x >= (int) xSix >= 0x < (int) xSix < 0fuente