C / C ++ 'da standart işaret fonksiyonu (signum, sgn) var mı?
Evet, tanıma bağlı.
C99 ve sonraki sürümlerde signbit()
makro<math.h>
int signbit
(gerçek yüzen x
); Makro döner onun argümanı değerinin işareti negatiftir ancak ve ancak sıfır olmayan bir değer. C11 §7.12.3.6
signbit
Yine de OP biraz farklı bir şey istiyor.
Negatif sayılar için -1 ve pozitif sayılar için +1 döndüren bir işlev istiyorum. ... şamandıralar üzerinde çalışan bir işlev.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Daha derine:
Aşağıdaki durumlarda gönderi belirli değildir: x = 0.0, -0.0, +NaN, -NaN
.
Klasik bir signum()
döner +1
üzerine x>0
, -1
üzerinde x<0
ve 0
üstündex==0
.
Birçok cevap zaten bunu kapsıyor, ancak ele almıyor x = -0.0, +NaN, -NaN
. Birçoğu, genellikle Sayı Değil ( NaN ) ve -0.0 içermeyen bir tam sayı bakış açısı için tasarlanmıştır. .
Tipik cevaplar signnum_typical()
Açık gibi çalışır -0.0, +NaN, -NaN
, geri döner 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;
}
Bunun yerine, bu işlevi öneriyorum: Açık -0.0, +NaN, -NaN
, geri döner -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;
}