2013-07-12 17 views
4

C++ 수치 속성을 이해하려고합니다. 따라서 언더 플로우 현상에 관심이 있습니다. 누구든지 언더 플로우의 예와 그것을 처리하는 방법을 줄 수 있습니까?부동 소수점 언더 플로 처리 방법은 무엇입니까?

+1

'0U-1'. UB 태그를 넣음으로써 언더 플로우 서명을 의미한다고 가정합니다. – chris

+0

@chris (논증의 목적으로 32 비트 부호없는 것으로 가정) 기술적으로 거기에는 언더 플로우/오버 플로우가 없습니다. 0U-1의 결과는 -1이 아닌 4294967295입니다. 4294967295는 32 비트 부호없는 int에 들어가므로 오버플로가 발생하지 않습니다. 반대로 -2147483648-1의 결과는 부호있는 32 비트 int에 맞지 않으므로 오버플로/언더 플로가 발생하는 -2147483649입니다. –

+0

@ R.MartinhoFernandes, 나는 게으르면서 그냥'INT_MIN'을 사용해도 추가 문자를 타이핑해야한다는 것을 알았습니다. 어느 쪽이든 내가 태그를 붙이려는 메모보다 더 적을 것입니다. 그것은 일종의 우울한 일입니다. – chris

답변

4

부동 소수점 언더 플로의 예는 다음

double d = DBL_MIN/3.0; 

적합하는 IEEE 754 구현, 즉, 그 정밀도를 제로에 가까운 인 수가 감소되는 「subnormal」에 d 설정한다. Wikipedia에 관한 많은 정보를 얻을 수 있습니다.

일부 구현은 "Flush to Zero"일 수 있습니다. 위 예제의 결과는 d을 0으로 설정하는 것입니다.

언더 플로는 음수 지수가 더 크므로 숫자를 나타낼 수없는 결과입니다. 어떻게 든 X 1 * 2 N을에 계산 금액 "정규화"계산,로이를 방지 것이 가능할 X 2 2 N ... 대신에 X의 1을 X * 2, ... N 개의 선택 사항입니다.

부동 소수점 언더 플로는 정의되지 않은 동작이 아닙니다. 원하는 경우 "FPU 예외"를 사용하여 폴링하거나 SIGFPE를 수신하여이를 감지 할 수 있습니다. "FPU 예외"는 이름을 제외하고 C++ 예외와 공통점이 없습니다.

+0

언더 플로가 발생할 수있는 다른 작업이 있습니까? – WildThing

+1

@WildThing sqrt (즉, +, -, *, /)를 제외한 다섯 가지 기본 IEEE 754 연산 모두 언더 플로우가 발생할 수 있습니다. 수학 결과가 '-DBL_MIN * (1-DBL_EPSILON/4)'과 'DBL_MIN * (1-DBL_EPSILON/4)'사이에있을 때마다 언더 플로가 발생합니다 (ULP의 일부만 나누거나 가져옴). –

+0

exp(), log(), sin() 또는 cos()는 어떨까요? – WildThing

-3
int main() 
{ 
     short int x ; 

     for(x=0;;x++) 
     { 
       printf("%d \n",x); 

       if(x < 0) 
        break; 
     } 
} 

O/P

--- 
--- 
-- 
32761 
32762 
32763 
32764 
32765 
32766 
32767 
-32768 

당신이 서명 없음에 언더 플로우 개념을 요구하고 가정. 여기서 개념은 서명 된 아니오입니다. 서클의 절반에 도달하면 서클과 같은 작품입니다. 서클의 절반에 도달하면 계속해서 끝나지 않을 것입니다. 그것은 시작합니다 0-32767 (+ve) -32768 to -1 (-ve) half.

이것은이 상황을 처리하는 프로그래머의 책임입니다. 언더 플로우하면 컴파일러에서 오류를 발생시키지 않습니다.

희망이 도움이됩니다.

+2

"서명 된 no라는 개념은 원의 절반에 도달하면 원과 같이 작동합니다. 원의 절반에 도달하면 계속되고 끝나지 않습니다." 별로, 아니. 일반적으로 연산의 결과가 주어진 유형 (예 : 16 비트 부호있는 정수의 경우 32768)에서 표현 될 수없는 경우 동작은 정의되지 않습니다. –

+0

UB가되고 싶다면 컴파일러가 오류를 발생시킬 수 있습니다. – chris

+0

이중 값 사용은 어떻습니까? – WildThing

관련 문제