2의 50승을 구하는 소스인데 출력값이 0이 되어버리네요..ㅠㅠ
글쓴이: nexusz99 / 작성시간: 월, 2009/02/09 - 8:06오후
#include <stdio.h> int main() { unsigned __int64 a = 1,i; FILE* fp; fp = fopen("c:\\test.txt","w+"); if(fp != NULL) printf("파일 생성 성공!\n"); else{ printf("파일 생성 실패\n"); return 0;} for(i=1;i<=50;i++) a = a * 2; fprintf(fp,"%d",a); printf("연산 완료\n"); fclose(fp); return 0; }
%d 에 문제가 있는거 같은데 %d는 어떤 반환값을 받는거에요?
아..그리고 디버깅으로 차례차례 돌려봤을 경우 2^25 까진 잘 계산되는데 그 이후로는 0이 되어버리네요.ㅠ
------추가질문---------
63승까지는 계산이 되는데 그 이후로는 안되네요..ㅠㅠ
범위를 넘어서네요..
어찌해야하죠
Forums:
%d -> %I64u (대문자
%d -> %I64u (대문자 i입니다.)
그런데 VC++6보다 높은 버전인 경우 표준 unsigned long long, %llu를 사용하시기 바랍니다. (소문자 L입니다.)
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
계산값이 0으로 되어버리는건 왜 그런거죠?
63승 까지는 출력이 되는데.. 그 이상은 안되네요..
역시 64비트범위를 넘어서는데 어찌해야하죠.ㅠㅠ
----------------------------------------
뻘짓도 일이다.
뻘짓도 일이다.
이런걸 쓰면
이런걸 쓰면 되죠..~~
http://shygypsy.com/tools/BigInt.cpp
WHAT'S UP
복사해서 붙여넣었더니
복 붙 했더니 오류가 13개.ㄷㄷ
뻘짓도 일이다.
뻘짓을 해보자면..
곱하기 연산은 당연히 shift + add로 이루어집니다.
7 * 3 이란 연산이 있다고 하면
111 * 11 의 2진 연산이고
00111
* 011
------------
00111
0111
------------
10101
로 계산이 되죠.. (별로 안이쁘게 그려지네요--)
이런 절차를 통해.. 루프를 돌려서 shift + add로 연산하면 되겠습니다.. 좋은 방법은 아니고 cpu의 원론적인 방법이죠..
중간에 booth encoding 같은 방법을 통해 연산량을 줄일 수도 있고..
아 물론 이렇게 해도 한 변수 안에 2^64까지 들어가는 것은 아닙니다.
상위 바이트를 나타내는 uint64를 하나 더 설정한 이후, flag register의 overflow bit 등을 참조하여 연산이 가능할 것입니다.
하지만 이렇게 하면 또 문제가 화면에 출력해 주는 일이죠.. 변수 두개에 나눠져있으니..
위 연산들과 비슷한 방법으로 진행하되 출력가능한 범위만큼 데이터를 쪼개서 연산하면 될 것 같긴 합니다..
모두 실행속도를 보장해 주긴 힘들겠네요 :(
다시 생각해보니 이러한 방법도 있을 수 있습니다.
버퍼에 숫자를 10진 문자열로 쭉 넣고..
예를 들어 327 * 13 이라면
char szMultiplicand[1024];
szMultiplicand[1023] = '7';
szMultiplicand[1022] = '2';
szMultiplicand[1021] = '3';
char szMultiplier[1024];
szMultiplier[1023] = '3';
szMultiplier[1022] = '1';
char szCarry[1024];
예.. 10진수 계산한듯 스트링 가지고 뻘짓을 하는거죠.. 스트링을 문잘 바꿔서 곱한다음에 carry 세팅하고 자신 값을 다시 스트링으로..
역시나 좋은 연산속도를 보장하긴 힘들겠죠..
댓글 달기