2

1000000を計算するプログラムを書きました!FFTを使用します。

(短くして、理論的な共鳴を省略してください:))

round()私がやりたいのは、double値とis -ed値の間のすべての丸め誤差を(math.h関数を使用して)測定して、この誤差がどのように動作しているか(および1/2を超えているかどうか)を確認することです。

これを行うには、丸めを行うたびにとの差を出力し、結果をファイルに書き込みますa。これを、を使用して呼び出します。round(a)diffs.txt~532Mb

fprintf(my_file,"%e\n",a-round(a));

次に、そのファイルに表示されるすべての値の出現をカウントする必要があります。

grep私は、次のように、sortとbashを使用して、複雑な方法でそうしていforます。

./compute-rounding-err #It creates diffs.txt
sort -u diffs.txt -o diff-sorted-unique
for i in `cat diff-sorted-unique`
do
 grep -e "$i" | wc -l >> diff-counted
done

結果は2つのファイルです。そのファイルをペアリングすると、取得します

diff-sorted-unique:     diff_counted:
-9.013892e-20           1           
...                     ...
0.000000e0              200
...                     ...
9.930234e               1

これらの値を取得して、それらからヒストグラムを作成できます。

私の恐れは、~532Mbファイルを含むラップトップでこれを行うには長い時間がかかることです。

誰かが物事をスピードアップする方法を知っていますか?

ありがとう。

4

1 に答える 1

3

各8バイトのdoubleを11〜12文字で書き込んでいるとすると、必要な全体のメモリは約450MBになります。つまり、アイテムの数は約50,000,000になります。

5,000万個の値を並べ替えるのにそれほど時間はかかりません。時間がかかるのは、forすべてのアイテムについてファイル全体をスキャンするループです。

より効率的な方法は、ファイルを並べ替えることですが、重複する値は保持します。次に、必要なのは、ファイルを1回パスして、類似した値(またはヒストグラムの精度に基づいて等しい値)をグループ化し、それらを値とカウントのペアに置き換えることだけです。

たとえば、次のファイルがある場合:

1
0.6
-2
0
-1
-0.6
0
0
3

並べ替えると、次のようになります。

-2
-1
-0.6
0
0
0
0.6
1
3

そして、このアルゴリズムに従う場合:

current_bucket = first value in file, floored to histogram_precision
bucket_count = 0
for all values v
    ; write current bucket + additional empty buckets
    while v > current_bucket + histogram_precision
        output   current_bucket   bucket_count
        current_bucket += histogram precision
        bucket_count = 0
    ; add v to current_bucket
    bucket_count += 1

たとえば、1として指定histogram_precisionすると、次のようになります。

-2       1
-1       2
0        4
1        1
2        0
3        1

ここで、各行は範囲内num countの値(count)の数を示しています[num, num+histogram_precision)

[0.5, 1.5)たとえば、の代わりにのようなバケットを使用することもでき[1 2)ます。その場合は、最初のバケットが計算される最初の行を微調整するか、whileループの条件をに変更する必要がありますv > current_bucket + histogram_precision / 2

于 2012-10-29T12:16:49.207 に答える