문제

C ++에서 NAN을 사용하는 가장 좋은 방법은 무엇입니까?

나는 찾았다 std::numeric_limits<double>::quiet_NaN() 그리고 std::numeric_limits<double>::signaling_NaN(). 사용하고 싶습니다 signaling_NaN 다음과 같이 초기화되지 않은 변수를 나타냅니다.

double diameter = std::numeric_limits<double>::signaling_NaN();

그러나 이것은 과제에 대한 신호 (예외 제기)입니다. 과제가 아니라 사용에 대한 예외를 제기하고 싶습니다.

사용할 방법이 있습니까? signaling_NaN 과제에 대한 예외를 제기하지 않고? 좋은 휴대용 대안이 있습니까? signaling_NaN 사용하면 부동 소수점 예외가 발생합니까?

도움이 되었습니까?

해결책

이것을 좀 더 살펴본 후에는 signaling_NaN 제공되는대로 쓸모가 없습니다. 부동 소수점 예외가 활성화되면 신호 NAN을 처리하는 것으로 호출되므로 즉시 예외가 발생합니다. 플로팅 포인트 예외가 비활성화되면 신호 NAN을 처리하면 자동으로 조용한 NAN으로 강등됩니다. signaling_NaN 어느 쪽이든 작동하지 않습니다.

Menkboy의 코드 작품이지만 신호를 사용하려고 시도하는 다른 문제에 대해 실행됩니다. 부동 소수점 예외를 활성화하거나 비활성화하는 휴대용 방법은 없습니다 (암시 된 바와 같이. 여기 그리고 여기), 그리고 당신이 사용하는 예외에 의존하는 경우, 타사 코드는 그들을 비활성화 할 수 있습니다 (설명대로 여기).

그래서 보입니다 Motti의 해결책 정말 최선의 선택입니다.

다른 팁

NAN이 의미하는 바는 CPU가 발생하면 신호가 발사된다는 것입니다 (따라서 이름). 초기화되지 않은 변수를 감지하려면 컴파일러의 경고 레벨을 높이면 일반적으로 초기에 이탈되지 않은 값을 사용하는 모든 경로를 감지합니다. 값이 초기화되면 부울 말을 저장하는 래퍼 클래스를 사용할 수 없습니다.

template <class T>
class initialized {
    T t;
    bool is_initialized;
public:
    initialized() : t(T()), is_initialized(false) { }
    initialized(const T& tt) : t(tt), is_initialized(true) { }
    T& operator=(const T& tt) { t = tt; is_initialized = true; return t; }
    operator T&() {
         if (!is_initialized)
             throw std::exception("uninitialized");
         return t; 
   }
};

이와 같은 것으로 예외를 유발하지 않고 신호 NAN을 변수에 쓸 수 있습니다 (NB : Untested).

void set_snan( double &d )
{
    long long *bits = (long long *)&d;
    *bits = 0x7ff0000080000001LL;
}

대부분의 장소에서 작동하지만 100% 휴대용이 아닙니다.

글쎄, 조용한 것과 신호 NAN의 정의를 돌보는 것은 실제로 어떤 차이도 만들 수 없습니다.

해당 함수에 사용되는 코드를 직접 사용할 수 있습니다. 어쩌면 그런 식으로 예외를 예방할 수 있지만,이 두 기능에서는 예외를 보지 못하면 다른 것과 관련이있을 수 있다고 생각합니다.

NAN을 직접 할당하려면 :

double value = _Nan._Double;

간단한 답변 : 헤더 파일에서 이와 같은 작업을 수행하고 다른 곳에서 사용하십시오.

#define NegativeNaN log(-1)

당신이 그들에게 어떤 종류의 조작을하고 싶다면 더 나은 확장 래퍼 기능을 작성하십시오. exp() 처럼 extended_exp() 등등!

C ++ 구현에는 플로팅 포인트 환경에 액세스하여 특정 부동 소수점 예외를 테스트하고 지우기위한 API가있을 수 있습니다. 보다 관련 질문에 대한 나의 대답 자세한 내용은.

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