Чи є в 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;
}