C / C ++ NaN 상수 (리터럴)?


답변:


153

C에서 NAN의 선언 <math.h>.

C ++에서 std::numeric_limits<double>::quiet_NaN()선언한다 <limits>.

그러나 값이 NaN인지 확인하기 위해 다른 NaN 값과 비교할 수 없습니다. 대신 사용 isnan()에서 <math.h>, 또는 C std::isnan()에서 <cmath>C ++한다.


20
- 또는 자신에게 수를 비교할 수 있습니다 x == x수익을 falseIFF가 xNaN의.
Archie 2013 년

7
@Archie : 나는 그것이 어느 언어로도 보장되지 않는다고 생각합니다.
Mike Seymour

3
@MikeSeymour 언어 표준은 아니지만 컴파일러가 IEEE 준수라고 주장하는 경우 작동 해야 합니다.
Pixelchemist 2013 년

37
@Pixelchemist : 사실, 난독 화가 필요하지만 이식성은 필요하지 않은 경우 옵션입니다. 개인적으로는 난독 화가없는 이식성을 선호하기 때문에 직접 제안하지는 않겠습니다.
Mike Seymour

9
사소한 참고 : NAN은 double이 아니라 float입니다. 링크
elenzil 오리온

23

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표준입니다. 이 이전 스레드 는 대부분의 상황에서 이것이 사실이어야한다고 설명합니다.


9

이는 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.

6
+1. Wikipedia에는 조용한 NaN신호 NaN 에 대한 정보가 있습니다 .
Drew Noakes

1

이것은 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)

1
다른 문자열에 대한 출력의 차이점은 무엇입니까? 일반적인 숫자 코드에서 어떤 것을 사용해야합니까?
quant_dev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.