답변:
C에서 NAN
의 선언 <math.h>
.
C ++에서 std::numeric_limits<double>::quiet_NaN()
선언한다 <limits>
.
그러나 값이 NaN인지 확인하기 위해 다른 NaN 값과 비교할 수 없습니다. 대신 사용 isnan()
에서 <math.h>
, 또는 C std::isnan()
에서 <cmath>
C ++한다.
x == x
수익을 false
IFF가 x
NaN의.
std::numeric_limits<double>::quiet_NaN()
내가 cppreference.com 문서를 선호한다고 말해야하지만 다른 사람들이 당신이 찾고 있다고 지적했듯이 . 특히이 진술이 약간 모호하기 때문에 :
std :: numeric_limits :: has_quiet_NaN == true 인 경우에만 의미가 있습니다.
이 사이트의 섹션을 확인하면 이것이이 사이트에서 의미하는 바를 쉽게 파악할 수 있습니다 std::numeric_limits::has_quiet_NaN
.
이 상수는 모든 부동 소수점 유형에 의미가 있으며 std :: numeric_limits :: is_iec559 == true 인 경우 true가 보장됩니다.
이는 같은 설명 여기 경우 true
수단 플랫폼이 지원하는 IEEE 754
표준입니다. 이 이전 스레드 는 대부분의 상황에서 이것이 사실이어야한다고 설명합니다.
이는 C ++에서 numeric_limits를 사용하여 수행 할 수 있습니다.
http://www.cplusplus.com/reference/limits/numeric_limits/
다음은 아마도보고 싶은 방법입니다.
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.
이것은 C의 double 또는 float에 NaN을 할당 할 수 있습니까?
예, C99부터 (C ++ 11) <math.h>
은 다음과 같은 기능을 제공합니다.
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
그것은 그들의 strtod("NAN(n-char-sequence)",0)
대응 물과 NAN
할당 과 같습니다 .
// 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);
샘플 출력 : (구현에 따라 다름)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)