2

我写了一个计算 1000000 的程序!使用 FFT。

(请允许我简短一点,省略一些理论上的共鸣:))

我想要做的是测量双精度值和round()-ed 值(使用math.h函数)之间的所有舍入误差,以检查该错误的行为方式(以及是否高于 1/2)。

我这样做是通过打印每次舍入之间的差异,a并将round(a)结果写入文件,让我们调用它diffs.txt,即~532Mb使用

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

我现在需要计算该文件中出现的每个值的出现次数。

我这样做是通过在我看来是一种复杂的方式,使用grepsortbashfor如下:

./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

结果是两个文件。如果我配对我获得的文件

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

我可以获取这些值并从中制作直方图。

我担心在带有~532Mb文件的笔记本电脑上这样做会花费很长时间。

有谁知道如何加快速度?

谢谢。

4

1 回答 1

3

假设您使用 11-12 个字符编写每个 8 字节双精度,那么您需要的总内存应该在 ~450MB 左右,这意味着您拥有的项目数应该在 50,000,000 左右。

对 5000 万个值进行排序应该不会花费很长时间。需要很长时间的是您的for循环,您可以在其中扫描每个项目的整个文件。

一种更有效的方法是对文件进行排序,但保留重复的值。然后,您只需要遍历文件,将相似的值(或相等的值,基于直方图的精度)分组并用值计数对替换它们。

例如,如果您有以下文件:

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

histogram_precision例如,给定为 1,您将获得:

-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 回答