2013-08-08 4 views
50

부동 소수점에 대해 읽었으며 NaN이 연산의 결과 일 수 있음을 알고 있습니다. 그러나 나는이 개념들이 정확히 무엇인지를 이해할 수 없다. 차이점은 무엇입니까?조용한 NaN과 신호 NaN의 차이점은 무엇입니까?

C++ 프로그래밍 중에 어느 것이 생성 될 수 있습니까? 프로그래머로서, 프로그램을 써서 sNaN을 만들 수 있습니까?

답변

37

연산의 결과가 조용한 NaN 인 경우 프로그램에서 결과를 확인하고 NaN이 표시 될 때까지는 이상한 현상이 없음을 알리는 표시가 없습니다. 즉, 부동 소수점 단위 (FPU) 나 라이브러리의 신호없이 부동 소수점이 소프트웨어로 구현되면 계산이 계속됩니다. 신호 NaN은 일반적으로 FPU의 예외 형식으로 신호를 생성합니다. 예외가 발생하는지 여부는 FPU의 상태에 따라 다릅니다.

C++ 11은 소수 언어 controls over the floating-point environment을 추가하고 standardized ways to create and test for NaNs을 제공합니다. 그러나 컨트롤이 구현되었는지 여부는 잘 표준화되어 있지 않으며 부동 소수점 예외는 일반적으로 표준 C++ 예외와 같은 방식으로 발견되지 않습니다.

POSIX/Unix 시스템에서 부동 소수점 예외는 일반적으로 SIGFPE의 처리기를 사용하여 포착됩니다.

+20

추가 : 일반적으로 시그널링 NaN (sNaN)의 목적은 디버깅을위한 것입니다. 예를 들어, 부동 소수점 객체는 sNaN으로 초기화 될 수 있습니다. 그런 다음 프로그램이 사용하기 전에 값 중 하나에 값이 실패하면 프로그램에서 sNaN을 산술 연산으로 사용할 때 예외가 발생합니다. 프로그램이 실수로 sNaN을 생성하지 않습니다. 정상적인 조작으로 sNaN이 생성되지 않습니다. 이들은 산술 연산의 결과가 아닌 시그널링 NaN을 가지기 위해 특별히 만들어진 것입니다. –

+8

대조적으로, NaN은보다 일반적인 프로그래밍을위한 것입니다. 수치 연산 결과가없는 경우 (즉, 결과가 실제 일 필요가있을 때 음수의 제곱근을 취하는 등) 일반적인 연산에 의해 생성 될 수 있습니다. 그들의 목적은 일반적으로 산술이 다소 정상적으로 진행되도록 허용하는 것입니다. 예를 들어 엄청나게 많은 수의 숫자가있을 수 있으며 그 중 일부는 정상적으로 처리 할 수없는 특별한 경우를 나타냅니다. 이 배열을 처리하기 위해 복잡한 함수를 호출 할 수 있으며 NaN을 무시하고 일반적인 산술로 배열에서 작동 할 수 있습니다. 끝나면 더 많은 작업을 위해 특수 사례를 분리합니다. –

+0

@wrdieter 고맙습니다. 그러면 사소한 차이 만이 예외를 생성하고 있습니다. – JalalJaberi