ページ 11

巨大な数の計算

Posted: 2011年2月10日(木) 00:47
by 初心者
いつもこのサイトにはお世話になっています。

32bitWindowsのC言語で、4G(4000000000)バイト以上の数の演算をしたく、
longint型に入れて計算してもマイナスになったりして
計算出来ないのですが、
何か良い方法は無いでしょうか。

文字列で扱って上位と下位に分けるしかないでしょうか。
よろしくお願いします。

Re: 巨大な数の計算

Posted: 2011年2月10日(木) 01:10
by Poco
64bit長の整数型を使用しても事足りませんか?
足りない場合は、多倍長演算用のライブラリの使用を考えてください。

Re: 巨大な数の計算

Posted: 2011年2月10日(木) 09:11
by maru
long intは32ビットです。
long long や __int64 を使ってみてください。

Re: 巨大な数の計算

Posted: 2011年2月12日(土) 12:09
by 初心者
ありがとうございます。

__int64でいけそうです。

助かりました!!!!!!!

Re: 巨大な数の計算

Posted: 2011年2月12日(土) 14:35
by 初心者
度々すみません、
ご教示頂いた方法で計算した結果の数を元に、
そのサイズのファイルを生成しようとしたのですが、

fp = fopen("test.txt","a"); で開いて
fprintf(fp,"a"); で、くり返し書き込んだところ

4,427,037,730 バイト

まででそれ以上かかれなくなってしまいました。

これ以上のファイルサイズに書き込む方法はありませんでしょうか。

宜しくお願い致します。

Re: 巨大な数の計算

Posted: 2011年2月12日(土) 17:46
by 七篠
フォーマットによって最大ファイルサイズが決まっているようです。
ぐぐってみた例
ttp://www.geocities.co.jp/SiliconValley-Oakla ... /file.html

OSの問題もあると思いますし、ファイルサイズの出力をどうしても1つのファイルにしなければいけないというのでなければ、ある程度で区切って別ファイルで保存されてはどうでしょうか。

Re: 巨大な数の計算

Posted: 2011年2月13日(日) 21:21
by みけCAT
動作未確認ですが、Windows APIを使ってみてはいかがでしょうか?

コード:

#include <stdio.h>
#include <windows.h>

int main(void) {
	unsigned long long i;
	HANDLE fp;
	char towrite[10];
	DWORD written;
	DWORD writesize;
	fp=CreateFile("test.txt",GENERIC_WRITE,0,NULL,
		CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
	if(fp==INVALID_HANDLE_VALUE) {
		printf("File open error.\n");
		return 1;
	}
	lstrcpy(towrite,"a");
	writesize=lstrlen(towrite);
	for(i=0;i<10000000000ULL;i++) {
		if(!WriteFile(fp,towrite,writesize,&written,NULL)) {
			printf("File Write Error at %llu.\n",i);
			CloseHandle(fp);
			return 1;
		}
		if(writesize!=written) {
			printf("File Write Size Not Correct at %llu.\n",i);
			CloseHandle(fp);
			return 1;
		}
	}
	CloseHandle(fp);
	printf("ok\n");
	return 0;
}