Czy w C / C ++ jest standardowa funkcja znaku (signum, sgn)?
Tak, w zależności od definicji.
C99 i nowsze wersje mają signbit()
makro w<math.h>
int signbit
(real-floating x
);
W signbit
makro zwraca wartość różną od zera, wtedy i tylko wtedy, gdy znak jego wartości argumentu jest ujemna. C11 §7.12.3.6
Jednak OP chce czegoś nieco innego.
Chcę funkcji, która zwraca -1 dla liczb ujemnych i +1 dla liczb dodatnich. ... funkcja działająca na pływakach.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Głębiej:
Post nie jest specyficzny w następujących przypadkach: x = 0.0, -0.0, +NaN, -NaN
.
Klasyczny signum()
powraca +1
on x>0
, -1
on x<0
i 0
on x==0
.
Wiele odpowiedzi już to obejmowało, ale nie zawiera odpowiedzi x = -0.0, +NaN, -NaN
. Wiele z nich jest nastawionych na całkowity punkt widzenia, w którym zwykle brakuje Not-a-Numbers ( NaN ) i -0,0 .
Typowe odpowiedzi działają jak signnum_typical()
On -0.0, +NaN, -NaN
, zwracają 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;
}
Zamiast tego proponuję tę funkcjonalność: On -0.0, +NaN, -NaN
zwraca -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;
}