求和运算符或均值运算符对数字消除更健壮吗?

计算科学 matlab 浮点
2021-12-18 07:49:10

注意:这个问题与 Matlab 或任何其他环境没有严格的关系(尽管我希望你参考我的 Matlab 代码)。

在这样产生的数组之间n = 10000中等间距的元素(在Matlab中):-pipi

n = 10000;    
x = linspace(-pi, pi, n);

然后我创建第二个数组x_r,它基本上包含x四舍五入到小数点后第三位的元素:

x_r = chop(x, 3);

然后,我计算sin所有元素的x并调用结果数组y我对x_r.

y = sin(x);
y_r = sin(x_r);

现在,我尝试将 的所有元素相加y,然后将 的所有元素相加y_r,即:

s = sum(y);
s_r = sum(y_r);

如果我尝试在点后打印ss_r使用100十进制数字,我会获得这些巨大的数字(可能第一个数字还没有完成):

s = -0.0000000000003170828901848210175171876477281318270923932134408573801920283585786819458007812500000000
s_r = -0.0000000000001331495677603378169351344695314764976501464843750000000000000000000000000000000000000000

现在,我想找到 和 的平均值yy_r分别保存在m和中m_r

m = mean(y);
m_r = mean(y_r);

如果我尝试使用 100 个十进制数字打印,我会得到另外两个巨大的数字mm_r

m = -0.0000000000000000317082890184820990794524483366356918770088064486473850012160369260527659207582473755
m_r = -0.0000000000000000133149567760337822432508902790402516613129923689416538035157344666004064492881298065

我的问题是(正如这个问题的标题所示)这两个操作中的哪一个对数字消除更健壮,sum或者mean操作?为什么?

我的猜测是,平均操作对数字消除的鲁棒性较差,因为它进行了更多计算,但我不确定,我不知道这是否是一个正确的解释。从结果中,我无法诚实地推断出任何有用的东西。

1个回答

首先要意识到的是,现实在十进制中是行不通的。sin(x)特别是不尊重小数 - 它以弧度工作因此,当您x_r最多截断时0.001,这确实是直角的 6.36619772368E-4'th。

当我看到它y_r有这么多尾随零时,我认为精度会大大降低。这可能是因为 MATLAB 必须恢复为有限精度的直接数值逼近,而非舍入版本允许更直接的公式。

这意味着在第二种情况下,数字消除完全无关紧要。