2011-06-12 4 views
14

fenv.h에 대한 문서 (표준)는 다소 혼란 스럽지만 특히 부동 소수점 예외에 대해서는 "논스톱 모드"라는 개념과 feholdexcept에 대해 혼란 스럽습니다. 내가 말할 수있는 한, IEEE 부동 소수점 구현에서 예외는 기본적으로 비 신호/"논스톱"이며, fenv.h 인터페이스는 기본값이 아닌 한 신호 모드를 활성화 할 수있는 방법을 제공하지 않는 것 같습니다. 시그널 예외 마스크를 설정하기 위해 비표준 확장을 가진 비 IEEE 시스템이나 시스템을 제외하고는 전체 개념이 feholdexcept입니까?feholdexcept 등의 용도는 무엇입니까?

답변

6

라이브러리를 구현 중이며 호출자가 코드를 호출하기 전에 부동 소수점 환경에서 수행 할 수있는 작업에 대해 알지 못한다고 가정 해보십시오. 그들은 예외를 unmask하고, 0으로 나누기가 42를 생성하도록하는 사용자 정의 트랩 처리기를 설치할 수 있습니다. 라이브러리가 0으로 나누기에 대한 기본 IEEE-754 동작을 갖는 것에 의존한다고 가정합니다. feholdexcept 함수를 사용하면이 동작을 적용 할 수 있습니다. 마스크되지 않은 예외를 완료 한 호출자의 환경은 fesetenv 함수를 사용하여 복원 할 수 있습니다.

이것은 상당히 모호한 사용 사례이지만 솔직히 의 모든 것fenv.h은 대부분의 프로그래머에게는 잘 보이지 않습니다.

+0

표준 라이브러리의 경우, 사양에 따라 동작하도록 기본 부동 소수점 환경에서 모든 함수를 호출해야한다는 점을 별도로 명시하지 않는 한 제 3 자 라이브러리 작성자도 부담을 감당할 수 있다고 생각합니다. 호출 응용 프로그램에서. 특히'fe * '함수를 사용하면 컴파일러가 (GCC가 아니더라도) 예외를 잃을 수있는 부동 소수점 최적화를 생략 할 수 있기 때문에 ... –

+0

@R .. :' '함수는 일반적으로 디자인과 문서화가 다소 부족합니다. 지금까지 C 라이브러리의 가장 약한 기능이라고 말할 수있을 것입니다. 개선 사항에 대한 제안 사항이 있으면 C 부동 소수점 작업 그룹으로 전달해 드리겠습니다. –

관련 문제