2011-09-01 7 views
16

0으로 부동 소수점 나누기를 수행하는 작은 프로그램이 있으므로 SIGFPE가 필요합니다.0으로 나누기가 SIGFPE을 throw하지 않습니다

#include <sys/types.h> 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 

void signal_handler (int signo) { 
    if(signo == SIGFPE) { 
     std::cout << "Caught FPE\n"; 
    } 
} 

int main (void) { 
    signal(SIGFPE,(*signal_handler)); 

    double b = 1.0; 
    double c = 0.0; 
    double d = b/c; 
    std::cout << "d = "<< d << std::endl; 
    return 0; 
} 

사실, 나는 다음과 같은 출력을 가지고 :

d = inf 

GCC 버전 4.5.2 (우분투/리나 4.5.2-8ubuntu4)

를 내가이에 SIGFPE를 던져해야 케이스? FP 연산 동작이 의존하는 요인 (컴파일러 플래그/CPU 유형 등)은 무엇입니까?

감사합니다.

+2

IEEE 플로트가있는 경우에는이 코드가 꽤 표준 적이어야합니다. – Ingo

+0

비슷한 질문 : [계산시 NaN 또는 inf가 런타임에 표시 될 때 gcc에 알려 줄 수 있습니까?] (http://stackoverflow.com/questions/2941611/can-i-make-gcc-tell-me-when- a- 계산 결과 in-nan-or-inf-at-runtime) – sleske

답변

6

부동 소수점 숫자의 경우 FPU 제어 단어를 설정하여이 동작을 변경할 수 있습니다. 살펴보기 here

+0

FPU 제어 단어에 대해 알고 있습니다. MS 플랫폼에서 _controlfp()로 설정 될 수 있습니다. 이 함수에는 POSIX와 동일한 기능이 있습니까? –

+1

@ 유리 : 표준 포함 파일''이'fesettrapenable'을 정의하는지보십시오. 이것은 비표준이지만 널리 사용 가능합니다.리눅스에서는'feenableexcept'을 사용하십시오. 그러나'#include '전에'#define _GNU_SOURCE'가 필요합니다. –

+1

@Yuri S. Cherkasov 그것은 fpu_control.h에 있습니다. 여기를 확인하십시오 : http://www.christian-seiler.de/projekte/fpmath/ – Oleg

9

0으로 정수 나누기를 수행하는 경우에만 신호가 나타납니다. 부동 소수점 수를 0으로 나누는 것은 잘 정의되어 있습니다.

이것은 실제로 Wikipedia article에서 잘 설명됩니다.

+0

나는 당신의 대답을 기다리고 있지 않다. 이것이 얼마나 의미있는 지 생각해보십시오. * 정수 * 나누기를 0으로 수행하면 * 부동 소수점 예외 *가 발생합니다. 부동 소수점 나누기를 0으로 수행하면 기본적으로 부동 소수점 예외가 발생하지 않습니다. 생활에 대한 수치 계산을하는 사람들은 이것이 기본 행동이라고 싫어하는 경향이 있습니다. 더 나쁜 것은 원하는 행동을 취할 표준이 없다는 것입니다. 제로 등으로 나누는 것은 거의 항상 잘못된 신호가됩니다. –

+5

출처 읽기 wikipedia : http://754r.ucbtest.org/standards/754.pdf : 7.2 : "제수가 0이고 배당이 유한 0이 아닌 숫자 인 경우 0으로 나누기 예외가 발생합니다 트랩이 발생하지 않으면 결과는 올바르게 서명 된 INFINITY (6.3)가됩니다. ". 그리고 8 장은 사용자가 ch.7에서 예외가 발생할 때 발생하는 트랩 처리기를 지정할 수 있어야한다고 알려줍니다. –

+0

흥미 롭습니다.하지만 그 목적은 그러한 상황을 포착하는 것입니다. 왜냐하면 0으로 나누는 것이 제 맥락에서 불법적 인 작업이기 때문입니다. –

4

대부분의 컴퓨터에서 기본 동작은 NaN (숫자가 아님) 및 무한대로 데이터를 오염시키기 때문에 신호를받지 못합니다. 부동 소수점 예외를 사용하도록 설정해야하며 그 방법은 기계마다 다릅니다. 시스템 헤더가있는 경우 fenv.h을보십시오. fesettrapenable 함수는 많은 기계에서 부동 소수점 예외를 포착 할 수있게합니다.

불행히도 부동 소수점 예외 처리를 설정하는 표준 함수는 없습니다.

관련 문제