Apakah ada fungsi tanda standar (signum, sgn) di C / C ++?
Ya, tergantung definisi.
C99 dan yang lebih baru memiliki signbit()
makro di<math.h>
int signbit
(mengambang nyata x
);
The signbit
pengembalian makro nilai nol jika dan hanya jika tanda nilai argumen negatif. C11 §7.12.3.6
Namun OP menginginkan sesuatu yang sedikit berbeda.
Saya ingin fungsi yang mengembalikan -1 untuk angka negatif dan +1 untuk angka positif. ... sebuah fungsi yang bekerja pada pelampung.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Lebih dalam:
Posting adalah tidak spesifik dalam kasus berikut: x = 0.0, -0.0, +NaN, -NaN
.
Sebuah klasik signum()
kembali +1
pada x>0
, -1
pada x<0
dan 0
di x==0
.
Banyak jawaban telah membahas hal itu, tetapi tidak membahasnya x = -0.0, +NaN, -NaN
. Banyak diarahkan untuk sudut pandang bilangan bulat yang biasanya tidak memiliki Not-a-Numbers ( NaN ) dan -0.0 .
Fungsi jawaban umum seperti signnum_typical()
Hidup -0.0, +NaN, -NaN
, mereka kembali 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;
}
Sebagai gantinya, saya mengusulkan fungsi ini: Hidup -0.0, +NaN, -NaN
, itu kembali -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;
}