¿Existe una función de signo estándar (signum, sgn) en C / C ++?
Sí, dependiendo de la definición.
C99 y posterior tiene la signbit()
macro en<math.h>
int signbit
(flotante real x
);
La signbit
macro devuelve un valor distinto de cero si y solo si el signo de su valor de argumento es negativo. C11 §7.12.3.6
Sin embargo, OP quiere algo un poco diferente.
Quiero una función que devuelva -1 para números negativos y +1 para números positivos. ... una función trabajando en flotadores.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Más adentro:
El post no es específica en los siguientes casos: x = 0.0, -0.0, +NaN, -NaN
.
Un clásico signum()
vuelve+1
sobre x>0
, -1
en x<0
y 0
en x==0
.
Muchas respuestas ya han cubierto eso, pero no abordan x = -0.0, +NaN, -NaN
. Muchos están orientados a un punto de vista entero que generalmente carece de Not-a-Numbers ( NaN ) y -0.0 .
Las respuestas típicas funcionan como signnum_typical()
On -0.0, +NaN, -NaN
, regresan 0.0, 0.0, 0.0
.
int signnum_typical(double x) {
if (x > 0.0) return 1;
if (x < 0.0) return -1;
return 0;
}
En cambio, propongo esta funcionalidad: On -0.0, +NaN, -NaN
, vuelve -0.0, +NaN, -NaN
.
double signnum_c(double x) {
if (x > 0.0) return 1.0;
if (x < 0.0) return -1.0;
return x;
}