Чи є в C / C ++ стандартна функція знаку (signum, sgn)?
Так, залежно від визначення.
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. Багато хто орієнтований на цілу точку зору, якій зазвичай не вистачає Not-a-Numbers ( NaN ) та -0.0 .
Типові відповіді функціонують як signnum_typical() On -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;
}