Supongo que abs
y fabs
se comportan de manera diferente al usar math.h
. Pero cuando uso solo cmath
y std::abs
, ¿tengo que usar std::fabs
o fabs
? ¿O no está esto definido?
100
En C ++, siempre es suficiente usar std::abs
; está sobrecargado para todos los tipos numéricos.
En C, abs
solo funciona con números enteros y necesita fabs
valores de punto flotante. Estos están disponibles en C ++ (junto con toda la biblioteca de C), pero no es necesario usarlos.
int
versión de la biblioteca C, hay sobrecargas paralong
,float
,double
ylong double
. La cláusula 26.2.7 también define una sobrecarga paracomplex
.std::
y simplemente lo usaabs
, su código funcionará como se esperaba en Windows pero usará laint
versión en Linux, que puede ser increíblemente difícil de depurar.Todavía está bien usar
fabs
paradouble
yfloat
argumentos. Prefiero esto porque asegura que si accidentalmente eliminostd::
elabs
, el comportamiento seguirá siendo el mismo para las entradas de punto flotante.Acabo de pasar 10 minutos depurando este mismo problema, debido a mi propio error de usar en
abs
lugar destd::abs
. Supuse queusing namespace std;
inferiríastd::abs
pero no fue así, y en su lugar estaba usando la versión C.De todos modos, creo que es bueno usarlo en
fabs
lugar deabs
para entradas de punto flotante como una forma de documentar su intención con claridad.fuente
std::abs
siempre parece invocarse (y no la versión C deabs
) al llamarabs
, siempre queusing namespace std;
se explique en el comenzando. Sin embargo, no sé si esto es específico del compilador.Hay una razón más para recomendar
std::fabs
explícitamente las entradas de punto flotante.Si olvida incluir <cmath>, su
std::abs(my_float_num)
puede ser enstd::abs(int)
lugar destd::abs(float)
. Es difícil de notar.fuente
"abs" y "fabs" solo son idénticos para los tipos flotantes de C ++, cuando se pueden traducir sin mensajes de sobrecarga ambiguos.
Estoy usando g ++ (g ++ - 7). Junto con el uso de plantillas y especialmente cuando se usa mpreal, hay casos con mensajes de "sobrecarga ambigua",
abs(static_cast<T>(x))
lo que no siempre resuelve eso. Cuando abs es ambiguo, hay posibilidades de que fabs esté funcionando como se esperaba. Para sqrt no encontré un escape tan simple.Desde hace semanas estoy luchando duro con C ++ "no existen problemas". Estoy actualizando un programa antiguo de C ++ a C ++ 14 para obtener más y mejor uso de la plantilla que antes. A menudo, el mismo parámetro de plantilla puede ser cualquier tipo flotante estándar o complejo o un tipo de clase. Por qué siempre, el doble de largo actuó algo más sensato que otros tipos. Todo estaba funcionando y ya había incluido mpreal antes. Luego estaba configurando mi tipo flotante predeterminado en mpreal y recibí una avalancha de errores de sintaxis. Eso dio miles de sobrecargas ambiguas, por ejemplo, para abs y sqrt, pidiendo diferentes soluciones. Algunos necesitaban funciones de ayuda sobrecargadas, pero fuera de una plantilla. Tuve que reemplazar individualmente mil usos de 0.0L y 1.0L con el tipo constante exacto usando Zero o One o un type_cast - la definición de conversión automática imposible debido a ambigüedades.
Hasta mayo encontré muy agradable la existencia de conversiones implícitas. Pero sería mucho más simple sin ninguna, y tener constantes de guardado de tipos con conversiones de tipos explícitas seguras a cualquier otro tipo de constante estándar.
fuente