부동 소수점 예외 소프트웨어가 숫자에 대해 부적절한 작업을 수행하려고 할 때 발생합니다. 이러한 유형의 예외는 사용자가 0으로 나누기, 음수를 짝수로 나누기, 음수의 제곱근 구하기, double 데이터 유형의 한계를 초과하는 계산 오버플로 등 잘못된 연산을 실행하려고 시도할 때 발생합니다.
C++에서는 “SIGFPE” 신호 처리기는 부동 소수점 예외를 처리합니다. (FPE). 사용자가 언급된 작업을 수행하려고 시도하면 이 신호 처리기가 호출됩니다. 신호 처리기가 개입하면 표준 출력에 오류 메시지를 인쇄하고 프로그램을 중지합니다.
부동 소수점 예외가 발생하는 이유는 무엇입니까?
부동 소수점 예외 프로그래밍 오류로 인해 또는 프로그램이 사양을 벗어난 값을 처리하려고 시도할 때 발생할 수 있습니다. 예를 들어, 프로그램이 정수를 0으로 나누려고 하거나 음수의 제곱근을 구하려고 하면 부동 소수점 예외가 발생합니다. 발생합니다. 또한 일부 부동 소수점 예외 프로세서 감지 오류로 인해 발생할 수 있습니다.
부적절한 작업, 언더플로, 오버플로, 0으로 나누기, 정확성 등 다양한 요인으로 인해 부동 소수점 예외가 발생할 수 있습니다. . 이 섹션에서는 이러한 주장을 하나씩 다루겠습니다.
1:불법적인 조작
사용자가 연산 표현을 잊어버렸거나 연산에 수학적 값이 없으면 잘못된 연산으로 인해 프로그램이 실행되지 않습니다. 여기에는 예를 들어 음수의 제곱근 및 로그와 같은 계산이 포함됩니다. 복소수를 처리할 때 음수의 제곱근을 구할 수 있지만 이를 표현할 수 있는 컴퓨터 기반 메커니즘은 없습니다.
또한 소프트웨어가 부동 소수점을 실행하면 잘못된 작업이 발생합니다. 정수 전용 위치에서의 연산. 이는 데이터에 대해 수행하려는 연산(부동 소수점 연산)과 저장된 데이터(정수)가 일치하지 않기 때문에 발생합니다.
2:영분할
부동 소수점 예외 정수를 0으로 나누려고 하면 발생합니다. NaN이나 무한대로 나누려고 할 때도 같은 일이 발생합니다. 다음은 몇 가지 예입니다:1/0, log(0).
3:오버플로
작업이 예상 범위를 벗어난 값을 반환하면 오버플로 예외가 발생합니다. 이 설명에 따르면 값은 표현 가능한 가장 작은 값보다 높거나 낮습니다.
4:언더플로우
언더플로는 계산 결과가 데이터 유형이 보유할 수 있는 것보다 적을 때 발생합니다.
5:부정확
작업 결과가 예상한 것과 다른 경우 이를 부정확한 예외라고 합니다. 바인딩되지 않은 정밀도와 지수 범위로 작업을 수행하면 이런 일이 발생합니다.
어떤 경우에는 그러한 상황이 적절하게 처리될 수 있습니다. 예를 들어, 프로그램이 숫자를 0으로 나누려고 할 때 일반적으로 프로그램이 충돌하도록 허용하는 대신 오류 메시지를 반환하고 프로그램을 정상적으로 종료하는 것이 좋습니다.
#include
#include
네임스페이스 std를 사용;
float Div(float num, float den)
{
if (den ==0) {
throw Runtime_error("수학 오류:0으로 나누려고 시도했습니다\n");
}
반환 (숫자 / 덴);
}
정수 메인()
{
부동소수점, 숫자, 결과;
숫자 =10;
디놈 =0;
{
를 시도해 보세요결과 =Div(숫자, 데놈);
cout <<"몫은 " <<결과 <
}
catch (runtime_error&e) {
cout <<"예외가 발생했습니다." <
}
}
이 코드에서 Div 함수는 main 내부의 try 블록에 의해 호출됩니다. . 디놈 0과 같지 않습니다. , Div 함수는 몫을 반환합니다. 그렇다면 런타임 오류 예외 던져진다. 런타임 오류 객체 e를 사용하여 what 함수를 호출하기 전에 catch 블록은 이 예외를 가로채고 "오류 발생" 텍스트를 인쇄합니다. . 예외를 식별하는 데 사용됩니다. stdjust 에 설명된 표준 예외 클래스 헤더 파일에는 what()이라는 가상 함수가 있습니다. . '수학 오류:0으로 나누려고 시도했습니다.' 메시지 결과로 인쇄됩니다.
출력
부동 소수점 예외를 방지하려면 C++에서는 함수에 전달된 모든 매개변수를 확인하고, 적절한 형식을 사용하고, 0 값에 대한 제수를 명시적으로 테스트하는 것이 필수적입니다. 또한 이중 데이터 유형을 사용할 때 프로그램에서 더 큰 연산 결과가 필요한 경우 데이터 유형의 범위를 확대하는 것이 중요합니다.
부동 소수점 예외 C++에서는 숫자 값에 대한 잘못된 연산으로 인해 발생하며 프로그램이 올바르게 실행되는 능력에 영향을 미칠 수 있습니다. 이러한 오류를 방지하려면 함수에 전달된 모든 매개변수를 확인하고 적절한 데이터 유형을 사용하는 것이 중요합니다. 또한 부동 소수점 예외를 포착하는 것이 좋습니다. .
결론