Existe uma função de sinal padrão (signum, sgn) em C / C ++?
Sim, dependendo da definição.
C99 e posterior possui a signbit()
macro em<math.h>
int signbit
(flutuante real x
);
A signbit
macro retorna um valor diferente de zero se e somente se o sinal do valor do argumento for negativo. C11 §7.12.3.6
No entanto, o OP quer algo um pouco diferente.
Eu quero uma função que retorne -1 para números negativos e +1 para números positivos. ... uma função trabalhando em carros alegóricos.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Mais profundo:
O post não é específico nos seguintes casos: x = 0.0, -0.0, +NaN, -NaN
.
Um clássico signum()
retorna +1
no x>0
, -1
no x<0
e 0
no x==0
.
Muitas respostas já abordaram isso, mas não abordam x = -0.0, +NaN, -NaN
. Muitos são voltados para um ponto de vista inteiro que geralmente não possui números não-números ( NaN ) e -0,0 .
Respostas típicas funcionam como signnum_typical()
Ativado -0.0, +NaN, -NaN
, elas retornam 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;
}
Em vez disso, proponho esta funcionalidade: Sim -0.0, +NaN, -NaN
, ela retorna -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;
}