문제

유효한 값을 보유하지 않는 것처럼 "비어있을 수있는"변수 (또는 플로트) 변수가 있습니다. 내장 유형의 플로트 및 더블 로이 조건을 어떻게 표현할 수 있습니까?

한 가지 옵션은 플로트와 부울이있는 래퍼이지만, 내 라이브러리에는 두 배로 작동하지 않는 물체가 아닌 두 배의 컨테이너가 있기 때문에 작동 할 수 없습니다. 다른 하나는 nan (std :: numeric_limits)을 사용하는 것입니다. 그러나 나는 변수가 NAN인지 확인할 방법이 없습니다.

숫자 이외의 다른 것을 의미하기 위해 "특별한"플로트 값이 필요한 문제를 어떻게 해결할 수 있습니까?

도움이 되었습니까?

해결책

Visual C ++에는 비표준이 있습니다 _isnan(double) 당신이 가져올 수있는 기능 float.h.

C에는 a가 있습니다 isnan(double) 당신이 가져올 수있는 기능 math.h.

C ++에는 ISNAN (Double) 기능이 있습니다. cmath.

다른 사람들이 지적했듯이, Nan을 사용하는 것은 많은 번거 로울 수 있습니다. 그들은 널 포인터처럼 다루어야하는 특별한 경우입니다. 차이점은 NAN이 일반적으로 코어 덤프 및 응용 프로그램 실패를 유발하지는 않지만 추적하기가 매우 어렵다는 것입니다. NAN을 사용하기로 결정한 경우 가능한 한 적게 사용하십시오. Nan 's의 과도한 사용은 공격적인 코딩 관행입니다.

다른 팁

우리는 NAN을 사용하여 그렇게했습니다.

double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);

평등 자체에 비해 NAN 값은 허위를 산출합니다. 그것이 당신이 NAN을 테스트하는 방법이지만 이는 경우에만 유효한 것 같습니다. std::numeric_limits<double>::is_iec559 사실입니다 (그렇다면 IEEE754도 준수합니다).

C99에는 매크로 호출이 있습니다 isnan 이것을 위해 math.h, NAN 값에 대한 부동 소수점 번호도 확인합니다.

내장 유형은 아니지만 일반적으로 사용합니다. boost::optional 이런 종류의 일을 위해. 당신이 그것을 절대적으로 사용할 수 없다면, 아마도 포인터가 트릭을 수행 할 것입니다. 포인터가 null이면 결과에 유효한 값이 포함되어 있지 않다는 것을 알 수 있습니다.

한 가지 옵션은 부유물에 플로트 광고가있는 래퍼이지만, 내 라이브러리에는 두 배로 작동하지 않는 물체가 아닌 두 배의 컨테이너가 있기 때문에 작동 할 수 없습니다.

그것은 부끄러운 일입니다. C ++에서는 실제 이중 (참조) 속성으로 자동 수색하는 템플릿 클래스를 만드는 것이 사소한 일입니다. (또는 해당 문제에 대한 다른 유형에 대한 참조) 템플릿 클래스에서 캐스트 연산자를 사용합니다. EG : 연산자 유형 & () {return 값; } 그런 다음 hasValue를 사용할 수 있습니다u003Cdouble> 일반적으로 두 배를 사용하는 곳이라면 어디에서나.

다른 하나는 nan (std :: numeric_limits)을 사용하는 것입니다. 그러나 나는 변수가 NAN인지 확인할 방법이 없습니다.

처럼 litb 그리고 제임스 슈크 또한 C99는 우리에게 isnan ()을 제공합니다.

그러나 조심하십시오! NAN 가치는 수학 및 논리를 정말 흥미롭게 만듭니다! 당신은 숫자가 둘 다> = foo가 아니고 <= foo가 아닐 수 없다고 생각할 것입니다. 그러나 Nan과 함께 할 수 있습니다.

내 도구 상자에 경고 -IF-NAN (X) 매크로를 유지하는 이유가 있습니다. 나는 과거에 몇 가지 흥미로운 문제가 발생했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top