2009-03-30 6 views
9

교육용으로 이러한 트랩을 가지고 놀고 싶습니다.IEEE 754 트랩을 개발자에게 공개하는 언어는 무엇입니까?

숫자 계산의 기본 동작에 공통적으로 발생하는 문제는 잘못된 연산에 나타난 Nan (또는 + -inf)을 "놓쳤다"는 것입니다. 기본 동작은 계산을 통한 전파이지만 일부 작업 (비교와 같은)은 체인을 끊고 Nan을 풀고 알고리즘의 이전 단계에서 특이점을 인정하지 않고 나머지 처리를 계속합니다.

가끔씩 우리는 이런 종류의 이벤트에 반응하는 방법을 가지고 있습니다 : 함수를 연장하거나 ("0/0 = 12 나의 경우"), 또는 단계를 버리고 다른 설정으로 시도하는 시간 영역 시뮬레이션에서 예측 자, 단계 크기 또는 기타).

제 질문은 다음과 같습니다. IEEE754 트랩을 개발자에게 노출시키는 언어를 알고 있습니까? 나는 그것을 ASM으로 망쳐 놓는 것처럼 느껴지지 않는다.

답변

0

C 및 아마 C++ 또는 python (간접적 인 액세스 일 수 있습니다)에서 파생 된 대부분의 언어. 저수준 언어가 그러한 지원을 할 것으로 기대하는 것이 합리적 일 것입니다.

에는 IEEE 754 번호 작업에 관한 많은 스크립트와 노트가 있습니다. 특히 of1.c은 부동 소수점 예외를 처리합니다. 마지막으로 유용한 정보가 들어있는 소스 http://grouper.ieee.org/groups/754/reading.html에서.

+0

조금 더 구체적으로 알려 주실 수 있습니까? 설명서에서이 항목을 찾을 수 없습니다. 플래그를 조작하는 방법을 찾았지만 트랩을 설정하는 방법은 알 수 없습니다. http://www.opengroup.org/onlinepubs/000095399/basedefs/fenv.h.html – nraynaud

+0

업데이트 됨 링크가 있습니다. –

+0

링크를 가져 주셔서 감사합니다. C 프로그램을 본 후에 (나는 잘 보였다고 생각하지만,이 전 처리기 잡음으로는 긍정 적이기는 어렵다), 나는 그런 것으로 드러난 함정을 보지 못했다. 깃발 조작 만 볼 수 있습니다. SIG_FPE 처리기는 하나의 플랫폼에 적합한 경우입니다. – nraynaud

3

지금까지 내가 아는 한, 당신은 C와 C++에서 소수점 예외 처리 부동 두 가지 선택이있다 : 당신은 (대부분의 환경은 기본적으로 할) 소수점 예외 부동 마스크/비활성화하면,

먼저, 당신이 볼 수 fetestexcept을 호출하여 부동 소수점 예외가 발생했는지 여부 fetestexcept는 Visual C++에서 사용할 수 없지만 MinGW 런타임 구현을 쉽게 훔칠 수 있습니다. 예외는 플래그가 지정되면 feclearexcept를 호출 할 때까지 지워지지 않으므로 일련의 계산 끝에 fetestexcept를 호출하여 예외가 발생했는지 확인할 수 있습니다. 이것은 요청한 트랩을 제공하지 않지만 NaN 또는 +/- inf와 같은 문제가 발생하고 필요에 따라 반응하는 경우 테스트 할 수 있습니다.

두 번째로 Linux에서 feenableexcept을 호출하거나 Windows에서 _controlfp을 호출하여 부동 소수점 예외를 활성화/비활성화 할 수 있습니다. 운영 체제가 프로세서에서 생성 한 부동 소수점 예외를 처리하는 방법은 운영 체제에 따라 다릅니다. 당신이 잡을 적절하게 반응하여 루틴을 알려주는 플래그를 설정하기위한 신호 처리기를 설치할 수 있도록

  • 리눅스에서 OS는 SIGFPE 신호를 전송한다.
  • OS는 구조적 예외 처리를 호출하여 프로세서 예외를 C에서 __try/__catch 블록 또는 C++에서 try/catch 블록을 사용하여 catch 할 수있는 언어 예외로 변환합니다.
  • 업데이트 : 맥 OS X를 들어, this answer에 설명 된대로 (SSE를 즉, 사용하지 않는) xmmintrin.h에서 _MM_SET_EXCEPTION_MASK을 사용하여 예외의 마스크를 사용/사용하기 위해, 그리고 당신이 기본 컴파일러 옵션을 사용으로 할 수 있어야한다 , SIGFPE를 사용하여 예외를 잡을 수 있어야합니다.

(이 점과 C 및 C++의 다른 부동 소수점 문제에 대해서는 호기심이 있다면 this blog posting에 작성했습니다.)

+0

좋은 지적입니다. 저는 이걸 가지고 노는 것이 었습니다. 운이 좋았 기 때문에, 2 개의 플랫폼 관련 문제가있는 Mac에 있습니다. http://www.gnu.org/software/hello/manual/gnulib/ feenableexcept.html http://lists.apple.com/archives/Darwin-dev/2006/Mar/msg00102.html – nraynaud

+0

내가 추가 한 링크 정보가 제한된 테스트에서 저에게 효과가있는 것 같습니다. –

+0

mac OS X 링크를 보내 주셔서 고마워요. 이것은 sse 유형 (float 및 double)에서만 작동하기 때문에 매우 불규칙한 처리를하지만, x87에만 해당하는 긴 double에는 해당하지 않으므로 매우 불규칙한 처리를합니다. 또한 예외를 활성화하면 현재 스레드가 아닌 전체 프로세스에서 예외를 처리하므로 작업이 어려워집니다. – nraynaud

0

나는 표준이 무엇인지 확신 할 수 없지만 경험으로 보았을 때 유용하다고 생각하는 것을 말할 수 있습니다. 저는 C++로 코딩했고 NaN은 때로는 최악의 악몽입니다. 그들은 쓸데없이 출력 될 때까지 조용히 나타나고 끝까지 계산을 통해 전파합니다. NaN을 유발하는 상황을 구체적으로 탐지하기 위해 종종 추가 코드를 작성해야했습니다. 저는 Visual C++ 2008을 사용하고 있습니다. 그래서이 방식으로 IEEE 표준을 따를 것으로 기대합니다.

+0

예, 완전히 표준입니다. 그러나 표준에서는 3 가지 수준의 사용을 정의합니다. 1) NaN 및 infs 전파 2) 확인할 수있는 플래그 3) 소프트웨어 트랩. 기본 동작을 유지하기 위해 사용량이 너무 많을 수 있습니다. – nraynaud

0

Maple의 프로그래밍 언어에는 IEEE-754를 존중하며 원하는 경우 사용자 고유의 트랩 처리기를 설정할 수있는 숫자 모델이 있습니다. 여기에 몇 가지 링크가 있습니다 :

드문 Maple 속성은 기본 부동 소수점 수는 10 진수 (2 진수가 아님)이며 임의의 정밀도입니다. 64 비트 이진 부동 소수점 숫자를 처리하려면 HFloat에 래핑하십시오. HFloat(0.2)이 사이의 차이를 계산

a := HFloat(0.2); 
b := 0.2; 
evalf[20](a - b); 

당신이 예를 들어, 실행하여 분명하다 C.에 이중 0.2을 할당받을 것 같은 숫자가 나타내는 반면, 예를 들어, 0.2는 정확히 소수점 수를 나타냅니다 ab은 10 진수 20 진수를 사용하며 결과는 0.11E-16입니다.