c에서 nan과 inf를 어떻게 사용하는가?
오류가 있으면 nan 또는 inf를 반환할 수 있는 수치 방법이 있으며, 테스트 목적으로 일시적으로 nan 또는 inf를 반환하도록 강제하여 올바르게 대응하고 있는지 확인하고 싶습니다.컴파일러에 의존하지 않고 C에 nan과 inf 값을 작성하는 신뢰할 수 있는 방법이 있습니까?
약 10분 동안 검색한 결과 컴파일러 의존 솔루션만 찾을 수 있었습니다.
구현에 다음 기능이 있는지 테스트할 수 있습니다.
#include <math.h>
#ifdef NAN
/* NAN is supported */
#endif
#ifdef INFINITY
/* INFINITY is supported */
#endif
의 INFINITY는 C99(또는 적어도 최신 초안)에 의해 보증되며, "사용 가능한 경우 정의 또는 부호 없는 무한대를 나타내는 형식 부동의 상수 표현으로 확장됩니다. 그렇지 않으면 변환 시 오버플로하는 형식 부동의 양의 상수로 확장됩니다."
NAN정의될 수도 있고 정의되지 않을 수도 있으며 "는 구현이 플로트 유형에 대해 조용한 NaN을 지원하는 경우에만 정의됩니다.NaN'이라는 곡입니다.
부동소수점 값을 비교할 경우 다음 작업을 수행합니다.
a = NAN;
그때도
a == NAN;
거짓입니다.NaN을 확인하는 한 가지 방법은 다음과 같습니다.
#include <math.h>
if (isnan(a)) { ... }
하다, 하다a != aaNaN 니다 na na na
, there있있 there 도 있다.isfinite(),isinf(),isnormal() , , , , 입니다.signbit()「」의 math.hC99 c c c c c c
에는 C99도 탑재되어 있습니다.nan★★★★
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
(참조: n1256).
은 두 가지 됩니다.float ★★★★★★★★★★★★★★★★★」double:
double NAN = 0.0/0.0;
double POS_INF = 1.0 /0.0;
double NEG_INF = -1.0/0.0;
편집: 이미 말한 바와 같이 오래된 IEEE 규격에서는 이러한 값이 트랩을 발생시켜야 한다고 규정되어 있습니다.그러나 새로운 컴파일러는 트랩을 끄고 지정된 값을 반환합니다.트랩은 오류 처리를 방해하기 때문입니다.
double a_nan = strtod("NaN", NULL);
double a_inf = strtod("Inf", NULL);
컴파일러에 의존하지 않고 프로세서에 의존하지 않고 컴파일러에 의존하지 않는 방법:
int inf = 0x7F800000;
return *(float*)&inf;
int nan = 0x7F800001;
return *(float*)&nan;
이것은 IEEE 754 부동소수점 포맷(x86이 사용)을 사용하는 모든 프로세서에서 동작합니다.
업데이트: 테스트 및 업데이트 완료.
나는 주로 사용한다.
#define INFINITY (1e999)
또는
const double INFINITY = 1e999
는 가장 IEEE 754이기 때문입니다.표시 가능한 최대 배수의 값은 대략1e3081e309잘 될 거야, 똑같이1e99999하지만 9점 만으로도 충분하고 기억에 남습니다.에( 「」에서는)#define) '대소문자Inf 더블
C(C++도 마찬가지) 규격에서는 부동소수점 연산 타입이 NAN 또는 INF를 지원할 필요가 없기 때문에 컴파일러에 의존하지 않는 방법은 없습니다.
편집: 방금 C++ 규격의 문구를 확인했는데, 다음 함수(템플릿 클래스 numeric_limits 멤버)가 표시되어 있습니다.
quiet_NaN()
signalling_NaN()
NAN 표현은 "사용 가능한 경우" 반환됩니다.「사용 가능한 경우」의 의미에 대해서는 상술하지 않고, 「실장의 FP 담당자가 서포트하고 있는 경우」와 같은 것을 생각할 수 있습니다.마찬가지로 다음과 같은 기능이 있습니다.
infinity()
"사용 가능한 경우" 긍정적인 INF 담당자가 반환됩니다.
이것들은 모두, 에 정의되어 있습니다.<limits>header - C standard는 비슷한 것을 가지고 있다고 생각합니다만(아마도 "사용 가능한 경우"일 것입니다). 그러나 현재 C99 standard의 복사본은 가지고 있지 않습니다.
<inf.h>
/* IEEE positive infinity. */
#if __GNUC_PREREQ(3,3)
# define INFINITY (__builtin_inff())
#else
# define INFINITY HUGE_VALF
#endif
그리고.
<bits/nan.h>
#ifndef _MATH_H
# error "Never use <bits/nan.h> directly; include <math.h> instead."
#endif
/* IEEE Not A Number. */
#if __GNUC_PREREQ(3,3)
# define NAN (__builtin_nanf (""))
#elif defined __GNUC__
# define NAN \
(__extension__ \
((union { unsigned __l __attribute__ ((__mode__ (__SI__))); float __d; }) \
{ __l: 0x7fc00000UL }).__d)
#else
# include <endian.h>
# if __BYTE_ORDER == __BIG_ENDIAN
# define __nan_bytes { 0x7f, 0xc0, 0, 0 }
# endif
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define __nan_bytes { 0, 0, 0xc0, 0x7f }
# endif
static union { unsigned char __c[4]; float __d; } __nan_union
__attribute_used__ = { __nan_bytes };
# define NAN (__nan_union.__d)
#endif /* GCC. */
이게 시간 상수가 아닌 것도 놀랍네요그러나 이러한 잘못된 결과를 반환하는 명령을 실행하는 것만으로 이러한 값을 쉽게 생성할 수 있을 것입니다.0, 로그 0, 태닝 90으로 나누면...
다음은 이러한 상수를 정의하는 간단한 방법으로, 휴대성이 높다고 확신합니다.
const double inf = 1.0/0.0;
const double nan = 0.0/0.0;
이 코드를 실행하면:
printf("inf = %f\n", inf);
printf("-inf = %f\n", -inf);
printf("nan = %f\n", nan);
printf("-nan = %f\n", -nan);
이해:
inf = inf
-inf = -inf
nan = -nan
-nan = nan
언급URL : https://stackoverflow.com/questions/1923837/how-to-use-nan-and-inf-in-c
'programing' 카테고리의 다른 글
| C/C++ 소스로 컴파일되는 프로그래밍 언어? (0) | 2022.07.27 |
|---|---|
| 템플릿에서 작업하지만 계산된 속성에서 작업하지 않는 혼합 (0) | 2022.07.27 |
| VueJs Vue.component에서 데이터를 가져오는 방법 (0) | 2022.07.26 |
| 함수를 사용하여 포인터에 포함된 주소 변경 (0) | 2022.07.26 |
| Java에서 무한대를 구현하는 방법2 (0) | 2022.07.26 |