Có chức năng ký hiệu chuẩn (dấu hiệu, sgn) trong C / C ++ không?
Có, tùy thuộc vào định nghĩa.
C99 và sau này có signbit()
macro trong<math.h>
int signbit
(nổi thật x
);
Các signbit
lợi vĩ mô một giá trị khác khi và chỉ khi các dấu hiệu của giá trị đối số của nó là tiêu cực. C11 §7.12.3.6
Tuy nhiên, OP muốn một chút gì đó khác biệt.
Tôi muốn một hàm trả về -1 cho số âm và +1 cho số dương. ... một chức năng làm việc trên phao.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Sâu sắc hơn:
Bài viết không cụ thể trong các trường hợp sau : x = 0.0, -0.0, +NaN, -NaN
.
Một signum()
lợi nhuận cổ điển +1
trên x>0
, -1
trên x<0
và 0
trên x==0
.
Nhiều câu trả lời đã bao gồm điều đó, nhưng không giải quyết x = -0.0, +NaN, -NaN
. Nhiều người đang hướng đến một quan điểm số nguyên thường thiếu Not-a-Numbers ( NaN ) và -0.0 .
Chức năng trả lời điển hình như signnum_typical()
On -0.0, +NaN, -NaN
, họ trở lại 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;
}
Thay vào đó, tôi đề xuất chức năng này: Bật -0.0, +NaN, -NaN
, nó trả về -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;
}