2013-04-06 2 views
0

루프 결과의 마지막 반복이 잘못되었습니다. 나는 빼기 전에 숫자가 길어질 수 있음을 안다. 그래서 나는 오래 힘을 길렀다. 마지막 반복 결과는 17888888888888888889이어야합니다. 왜 그렇지 않습니까? (9 분할 전)long long 정수를 사용하는 계산 오류

const int NR_LEVELS = 18; 
    unsigned long levels[NR_LEVELS]; 
    unsigned long long power = 10; 
    for(unsigned int i = 0; i < NR_LEVELS; i++) { 
    levels[i] = ((i+1)*10*power-(i+2)*power+1)/9; 
    cout << levels[i] << endl; 
    power *= 10; 
    } 
    levels[17] = 17888888888888888889lu; 
    for(unsigned int i = 0; i < NR_LEVELS; i++) { 
    cout << levels[i] << endl; 
    } 

답변

3

중간 값은 64 비트 정수 오버플. 그것이 예상 결과를 얻지 못하는 이유입니다.

더 정확하게는, 64 비트 정수의 최대 값은 다음과 분할 전의 (최소)의 중간 값과 비교

18446744073709551615 

:

161000000000000000001 

이 응답 long 가정된다 유형을 64 비트 정수형으로 변환하면 (표준에서는 long 유형이 32 비트 이상이므로 환경에 따라 32 비트 정수형을 얻을 수도 있음). OS, 컴퓨터 아키텍처 및 컴파일러에 따라 long 유형의 상한선이 다를 수 있습니다.

+0

aaaarrrrr ... 나는 하루 종일 알고 있었지만 어쨌든 나는 int> int라고 생각하고 그것을 알 수 없다 : C –

+0

@ lord.didger : 코드에 타입 문제가 있지만, 올바른 유형을 선택하면 올바른 결과를 얻을 수 없습니다. – nhahtdh