Điều này có thể gán a NaN
cho a double
hoặc float
trong C / C ++ không? Giống như trong JavaScript bạn làm: a = NaN
. Vì vậy, sau này bạn có thể kiểm tra xem biến có phải là số hay không.
Điều này có thể gán a NaN
cho a double
hoặc float
trong C / C ++ không? Giống như trong JavaScript bạn làm: a = NaN
. Vì vậy, sau này bạn có thể kiểm tra xem biến có phải là số hay không.
Câu trả lời:
Trong C, NAN
được khai báo trong <math.h>
.
Trong C ++, std::numeric_limits<double>::quiet_NaN()
được khai báo trong <limits>
.
Nhưng để kiểm tra xem một giá trị có phải là NaN hay không, bạn không thể so sánh nó với một giá trị NaN khác. Thay vào đó, hãy sử dụng isnan()
từ <math.h>
trong C hoặc std::isnan()
từ <cmath>
trong C ++.
x == x
trả về false
iff x
là NaN.
Như những người khác đã chỉ ra rằng bạn đang tìm kiếm std::numeric_limits<double>::quiet_NaN()
mặc dù tôi phải nói rằng tôi thích các tài liệu cppreference.com hơn . Đặc biệt là vì tuyên bố này hơi mơ hồ:
Chỉ có ý nghĩa nếu std :: numeric_limits :: has_quiet_NaN == true.
và thật đơn giản để tìm ra ý nghĩa của điều này trên trang web này, nếu bạn kiểm tra phần của họ trên std::numeric_limits::has_quiet_NaN
đó cho biết:
Hằng số này có ý nghĩa đối với tất cả các kiểu dấu phẩy động và được đảm bảo là đúng nếu std :: numeric_limits :: is_iec559 == true.
như được giải thích ở đây nếu true
có nghĩa là nền tảng của bạn hỗ trợ IEEE 754
tiêu chuẩn. Đây thread trước giải thích điều này nên là đúng đối với hầu hết các tình huống.
Điều này có thể được thực hiện bằng cách sử dụng numeric_limits trong C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Đây là những phương pháp bạn có thể muốn xem:
infinity() T Representation of positive infinity, if available.
quiet_NaN() T Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN() T Representation of signaling "Not-a-Number", if available.
Điều này có thể gán một NaN cho một double hoặc float trong C ... không?
Có, vì C99, (C ++ 11) <math.h>
cung cấp các chức năng dưới đây:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
giống như strtod("NAN(n-char-sequence)",0)
đối tác của họ và NAN
cho các bài tập.
// Sample C code
uint64_t u64;
double x;
x = nan("0x12345");
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = -strtod("NAN(6789A)",0);
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = NAN;
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
Đầu ra mẫu: (Tùy thuộc vào việc thực hiện)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)