문제

MatheMatical 이유로 정의되지 않은 값에 대해 IEEE754 Floating Point NAN (NOMBER)을 사용하는 것이 좋은 생각입니까?

우리의 경우 다른 장치에서 값이 수신되지 않았기 때문에 아직 설정되지 않았습니다. 컨텍스트는 IEC1131 Real32 값을 사용하는 임베디드 시스템입니다. 편집하다: 프로그래밍 언어는 C이므로 C99의 NAN 및 ISNANF (X)를 사용할 가능성이 높습니다. 비록 우리는 이것을 OS 호환성 계층으로 가져 오려면 약간의 추가 연소가 필요할 수 있습니다.

프로그래밍 언어의 기본값은 내부 표현이 모두 0으로 부동 소수점 변수를 양수로 초기화하는 것 같습니다. 0은 유효한 값의 범위에 있기 때문에 우리에게는 사용할 수 없습니다.

NAN을 사용하는 것은 깨끗한 솔루션처럼 보이지만 아마도 가치보다 더 번거롭고 다른 가치를 선택해야합니까?

도움이 되었습니까?

해결책

이 질문을 발견했습니다.

이것은 IEEE 754위원회가 염두에두고있는 NAN의 사용 중 하나입니다 (저는위원회 위원이었습니다). 산술에서 NAN에 대한 전파 규칙은 초기화 된 데이터가 포함 된 긴 계산 시퀀스의 결과를 얻은 결과 유효한 결과에 대한 결과를 오해하지 않기 때문에이를 매우 매력적으로 만듭니다. 또한 계산을 통해 추적하여 초기화 된 데이터를 훨씬 더 간단하게 사용하는 위치를 찾을 수 있습니다.

즉, 754위원회의 통제를 벗어난 몇 가지 함정이 있습니다. 다른 하드웨어가 속도로 NAN 값을 지원하는 것은 아니기 때문에 성능 위험이 발생할 수 있습니다. 다행히도 성능-약정 설정에서 초기화 된 데이터에 대해 많은 작업을 수행하지는 않습니다.

다른 팁

Nans는 '가치 없음'문자에 대한 합리적인 선택입니다 (예 : D 프로그래밍 언어는 초기화되지 않은 값에이를 사용합니다). 그러나 관련 비교는 거짓이므로 몇 가지 놀라움을 얻을 수 있습니다.

  • if (result == DEFAULT_VALUE), 예상대로 작동하지 않습니다 DEFAULT_VALUE Jon이 언급 한 것처럼 Nan입니다.

  • 또한 조심하지 않으면 범위 점검에 문제가 발생할 수 있습니다. 기능을 고려하십시오 :

bool isOutsideRange(double x, double minValue, double maxValue)
{
    return x < minValue || x > maxValue;
}

x가 nan 인 경우이 함수는 x가 minValue와 maxValue 사이에 있다고 잘못보고합니다.

사용자가 테스트 할 마법 가치 만 원한다면 NAN 대신 긍정적 또는 부정적인 무한대를 추천합니다. 동일한 트랩이 제공되지 않기 때문입니다. NAN의 모든 작업이 NAN을 초래하는 속성을 원할 때 NAN을 사용하십시오. 예를 들어 값을 확인하는 발신자에 의존하고 싶지 않을 때는 편리합니다.

편집 : 나는 처음에 "그들과 관련된 모든 비교가 사실 일 것입니다"를 입력했습니다. 위의 의미는 아니며, 내가 의미하는 것이 아니며, 잘못되었습니다. 그들은 모두 거짓입니다!

그 때문에 비슷한 상황에서 NAN을 사용했습니다. 일반적인 기본 초기화 값 0도 유효한 값입니다. Nans는 지금까지 잘 작동합니다.

그건 그렇고, 기본 초기화 값이 일반적으로 (예 : Java Primitive 유형) 0이 아닌 이유가 아닌 좋은 질문입니다. 42 또는 그 밖의 일이 아닐 수 없습니까? 나는 0의 이론적 근거가 무엇인지 궁금합니다.

나는 그것이 일반적으로 나쁜 생각이라고 생각합니다. 명심해야 할 한 가지는 대부분의 CPU가 Nan이 "일반적인"플로트보다 훨씬 느리게 취급한다는 것입니다. 그리고 일반적인 설정에서 NAN이 없을 것이라고 보장하기는 어렵습니다. 수치 컴퓨팅에 대한 나의 경험은 종종 가치가있는 것보다 더 많은 어려움을 초래한다는 것입니다.

올바른 솔루션은 플로트에서 "값 부재"를 인코딩하는 것을 피하는 것입니다. 그러나 다른 방식으로 신호를 보내는 것입니다. 그러나 코드베이스에 따라 항상 실용적인 것은 아닙니다.

Nan 's에주의하십시오 ... 조심하지 않으면 산불처럼 퍼질 수 있습니다.

플로트에 대해 완벽하게 유효한 가치이지만 관련 과제는 NAN과 동일하므로 코드를 통해 전파됩니다. 이것은 당신이 그것을 잡으면 디버깅 도구로 매우 좋습니다. 그러나 당신이 무언가를 출시 할 무언가를 가져오고 어딘가에 프린지 케이스가있는 경우에도 진정한 성가신 일 수도 있습니다.

D는 Floats Nan을 기본값으로 제공하기위한 근거로 사용합니다. (내가 동의하는지 확실하지 않습니다.)

내 감정은 약간 해킹되지만이 NAN 가치로 작업하는 다른 모든 숫자는 NAN을 결과적으로 제공합니다. 버그 보고서에서 NAN을 볼 때 적어도 어떤 종류의 실수를 사냥하는지 알고 있습니다.

기본 요구가 장치에서받을 수있는 숫자를 나타내지 않는 부동 소수점 값을 갖는 경우 그리고 장치가 NAN을 반환하지 않을 것을 보장하면 나에게 합리적으로 보입니다.

환경에 따라 NAN을 감지하는 특별한 방법이 필요할 것입니다 (사용하지 마십시오. if (x == float.NaN) 또는 당신의 동등한 것이 무엇이든.)

이것은 나에게 Nans에게 잘 사용되는 것 같습니다. 내가 생각했으면 좋겠어 ...

물론, 그들은 바이러스처럼 전파되어야합니다. 그것이 요점입니다.

나는 무한대 대신 NAN을 사용할 것이라고 생각합니다. 신호 NAN을 사용하고 첫 번째 용도로 이벤트를 일으키는 것이 좋을 수도 있지만, 너무 늦게는 처음으로 조용히해야합니다.

NAN을 기본값으로 사용하는 것이 합리적입니다.

(0.0 / 0.0), 반환 NAN과 같은 일부 표현식은 주목하십시오.

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