统计收集程序中的舍入误差(C)

时间:2012-10-29 11:48:57

标签: c bash histogram

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

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

我想要做的是测量双值之间的所有舍入误差,并且round() - ed值(使用math.h函数)来检查此错误的行为(如果它在上面1/2)。

我这样做是通过在每次舍入时打印around(a)之间的差异,并将结果写入文件,让我们称之为diffs.txt,即{ {1}},使用

~532Mb

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

我这样做是以错综复杂的方式进行的,使用fprintf(my_file,"%e\n",a-round(a));grep和bash sort如下:

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

我可以取这些值并用它们制作直方图。

我担心在带有diff-sorted-unique: diff_counted: -9.013892e-20 1 ... ... 0.000000e0 200 ... ... 9.930234e 1 文件的笔记本电脑上这样做需要很长时间。

任何人都知道如何加快速度?

感谢。

1 个答案:

答案 0 :(得分:3)

鉴于您正在编写每个8字节的双字符,并且有11-12个字符,那么您需要的总内存应该在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的条件。 1}}循环到v > current_bucket + histogram_precision / 2