c++ - ejemplos - ¿Cuándo uso fabs y cuándo es suficiente usar std:: abs?
math.h c++ ejemplos (4)
"abs" y "fabs" son solo idénticos para los tipos de flotación 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 difíciles de "sobrecarga ambigua": abs(static_cast<T>(x))
no siempre está resolviendo eso. Cuando los abdominales son ambiguos, hay posibilidades de que fabs funcione como se esperaba. Para sqrt no encontré un escape tan simple.
Desde hace semanas estoy luchando duro en C ++ "problemas no existentes". Estoy actualizando un viejo programa 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 real cualquier float estándar o tipo complejo o un tipo de clase. Por qué alguna vez, hace mucho tiempo que actuó un poco más sensible que otros tipos. Todo estaba funcionando, y había incluido mpreal antes. Luego, establecí mi tipo de flotación predeterminado en mpreal y obtuve un aluvión de errores de sintaxis. Eso dio miles de sobrecargas ambiguas, por ejemplo, abs y sqrt, llorando por 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 - definición de conversión automática imposible debido a ambigüedades.
Hasta mayo, encontré que las conversiones implícitas eran muy buenas. Pero mucho más simple sería sin ninguna, y tener constantes typesave con type_casts explícitos seguros a cualquier otro tipo constante estándar.
Supongo que los abs
y las fabs
están comportando 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?
En C ++, siempre es suficiente usar std::abs
; está sobrecargado para todos los tipos numéricos.
En C, los abs
solo funcionan en enteros, y necesita fabs
para los valores de coma flotante. Estos están disponibles en C ++ (junto con toda la biblioteca C), pero no es necesario usarlos.
Hay una razón más para recomendar std::fabs
para entradas de punto flotante explícitamente.
Si olvida incluir <cmath>, su std::abs(my_float_num)
puede ser std::abs(int)
lugar de std::abs(float)
. Es difícil de notar.
Todavía está bien usar fabs
para argumentos double
y float
. Prefiero esto porque asegura que si accidentalmente quito el abs
los abs
, el comportamiento sigue siendo el mismo para las entradas de coma flotante.
Acabo de pasar 10 minutos depurando este mismo problema, debido a mi propio error de usar abs
lugar de std::abs
. Supuse que el using namespace std;
inferiría std::abs
pero no lo hizo, y en su lugar estaba usando la versión C.
De todos modos, creo que es bueno usar fabs
lugar de abs
para las entradas de punto flotante como una forma de documentar claramente tu intención.