2016-10-07 3 views
-4
#include <stdio.h> 
int test1(int x, int n){ 
    int times=31/n; 
    return ((1-(1<<(n*times)))/(1-(1<<n))); 
} 

는 I 1 < = N < 그것만 1 = 31 < = N <, 난 그것을 어떻게 변경할 때 32부동 소수점 예외

작품 = 계산을 수행하고, N = 32 ? 내가 엑스 코드에서의 N = 32의 경우 테스트로서, 디버거를 트리거하고 (코드 = exc_i386_div가 ....
미리 감사드립니다.

+1

"부동 소수점"또는 "예외"라고 할 수있는이 코드에는 * nothing *이 있습니다 ... –

+1

무엇을 가정하는지 알려주지 않으면 어떻게 "작동"시키는 지 어떻게 말할 수 있습니까? 할 것? – kaylum

+1

'31/32'의 ** 정수 ** 결과는 어떻게해야합니까? –

답변

1

괜찮은 기회가 스레드 1 exc_arithmetic를 보여줍니다 당신이 1 << 32을 수행 할 때, 1 << 0으로 처리되며 (정의되지 않은 동작을 호출하기 때문에), '0으로 나누기'정수를 수행하기 때문에 '부동 소수점 예외'가 발생합니다. 요즘은 이것이 가장 일반적인 원인입니다. 부동 소수점 연산을 수행하는 경우 0으로 나누기 위해 무한대가 반환됩니다 (자동으로).

0

방금 ​​문제를 해결할 수있는 방법을 알았습니다. 문제는 1<<32 사례입니다. ~하려고합니다. oid).

1 << n(1 << (n-1))*2으로 변경했습니다. 다른 방법으로는 수학을 적용했습니다.

return ((1-(1<<(n*times)))/(1- (1<<(n-1))*2 )); 
+0

'int' 타입이 32 비트 타입이라면 여전히 정의되지 않은 동작을 호출하고 있습니다. 32 비트보다 길면 처음부터 오류가 발생하지 않았을 것입니다. 당신의 계산이 평가되어야하는 것을 설명 할 수 있습니까? –

+0

@JonathanLeffler, 내가 뭘했는지는 입력으로 32 비트 정수와 숫자 n을 얻는 것이고, 출력은 입력의 n 비트 반복으로 채워야합니다. 예를 들어, 입력이 1이고 2. (반복 패턴이 01 인 경우) 출력은 0x55555555 여야합니다. 입력이 0x12345678, 32이면 출력은 0x12345678이됩니다. 순차 계열의 합계를 계산할 수 있음을 알게되면서 결과를 얻습니다. 내가 묻는 것은 그것의 일부입니다. – Jack

0

의 보수 플랫폼에 대한 몇 가지 현대적인 구현은

int a = INT_MIN; 
int b = -1; 
int c = a/b; 

도있다 "부동"아무것도 생각 다음 코드에서 발생 분할 오버 플로우 정수에 대한 응답으로 "부동 소수점 예외"를 생성합니다. GCC는 그러한 플랫폼의 한 예입니다.

분명히, 표현식은 정수를 "지나치다"에 의해 트리거되는 정의되지 않은 동작의 실제 플랫폼 별 표현과 같은 종류의 문제로 실행됩니다.

P. @Jonathan Leffler가 지적한 것처럼, 제로에 의한 정수 나누기도 GCC에서 "부동 소수점 예외"를 생성합니다. 이는 아마도 귀하의 경우에 발생할 가능성이 훨씬 높습니다.