【发布时间】:2012-10-18 17:36:13
【问题描述】:
我写了一个计算 1000000 的程序!使用 FFT。
(请允许我简短一点,省略一些理论上的共鸣:))
我想要做的是测量一个双精度值和 round()-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
结果是两个文件。如果我将获得的文件配对
diff-sorted-unique: diff_counted:
-9.013892e-20 1
... ...
0.000000e0 200
... ...
9.930234e 1
我可以获取这些值并用它们制作直方图。
我担心在带有~532Mb 文件的笔记本电脑上这样做会花费很长时间。
有人知道如何加快速度吗?
谢谢。
【问题讨论】:
-
你为什么要这样做?你真的需要一个〜532 Mb(523 * 10 ^ 6位?532 MiB?)文件,还是你只需要一个直方图(出于某种未知/模糊的原因),或者你只需要知道最坏的情况错误?对于使用
double引起的错误,你在做什么(有效数字太小而无法应对 10000!没有累积精度损失)?