Есть ли стандартная функция знака (signum, sgn) в C / C ++?
Да, в зависимости от определения.
C99 и более поздние версии имеют макрос signbit()
в <math.h>
int signbit
(реальный плавающий x
);
Макрос signbit
возвращает ненулевое значение тогда и только тогда, когда знак его значения аргумента отрицателен. C11 §7.12.3.6
И все же ОП хочет что-то немного другое.
Мне нужна функция, которая возвращает -1 для отрицательных чисел и +1 для положительных чисел. ... функция, работающая с плавающей точкой.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Глубже:
Пост не является конкретным в следующих случаях, x = 0.0, -0.0, +NaN, -NaN
.
Классический signum()
возвращает +1
в x>0
, -1
в x>0
и 0
в x==0
.
Многие ответы уже охватили это, но не относятся к x = -0.0, +NaN, -NaN
. Многие из них ориентированы на целочисленную точку зрения, в которой обычно отсутствуют не-числа ( NaN ) и -0.0 .
Типичные ответы работают как signnum_typical()
Вкл. -0.0, +NaN, -NaN
, они возвращают 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;
}
Вместо этого предложите эту функциональность: при -0.0, +NaN, -NaN
возвращается -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;
}