Điều này có thể gán a NaNcho a doublehoặc floattrong 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 NaNcho a doublehoặc floattrong 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 == xtrả về falseiff xlà 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 truecó nghĩa là nền tảng của bạn hỗ trợ IEEE 754tiê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à NANcho 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)