algorithm - 生成算法舍入错误报告的 MATLAB 脚本

标签 algorithm matlab

我有兴趣使用或创建一个脚本来获取算法中的错误舍入报告。 我希望脚本或类似的东西已经完成...... 我认为这对数字电子系统设计很有用,因为有时需要研究精度误差如何取决于设计中考虑的小数位数。 该脚本将使用 3 个元素,即算法代码、输入和输出。 该脚本将逐行显示算法代码的错误。 它会用像 roundn 这样的命令修改算法代码并比较输出的错误。 我会将错误定义为

Errorrounding = Output(without rounding) - Output round 

例如我有下一个算法

calculation1 = input*constan1 + constan2 %line 1 of the algorithm
output = exp(calculation1)               %line 2 of the algorithm

其中'input'是n个元素向量的输入,'output'是输出,'constan1'和'constan2'是常量。 n是输入向量的元素个数

所以,我会把我的算法放在脚本中,它会自动生成下一个算法:

input_round = roundn(input,-1*mdec)
calculation1 = input*constant1+constant2*ones(1,n)
calculation1_round = roundn(calculation1,-1*mdec)
output=exp(calculation1_round)
output_round= roundn(output,-1*mdec)

其中 mdec 是要考虑的小数位数。 最后脚本给出下一条消息

The rounding error at line 1 is #Errorrounding_calculation1

其中“#Errorrounding”将是下一个操作的结果 Errorrounding_calculation1 = calculation1 - calculation1_round

The rounding error at line 2 is #Errorrounding_output

其中 'Errorrounding_output' 将是下一个操作的结果 Errorrounding_output = output - output_round

有没有人知道是否有类似的东西已经做过,或者Matlab提供了解决一些相关问题的解决方案? 谢谢。

最佳答案

第一点:我建议阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic大卫·戈德堡。它应该阐明有关浮点计算的许多问题,这将帮助您更多地了解您正在考虑的问题的复杂性。

第二点:我认为您正在考虑的问题比您意识到的很多复杂。您对由于四舍五入降低精度而引入计算的错误感兴趣。您没有意识到的是,这些错误将通过您的计算传播。考虑你的例子:

output = input*C1 + C2

如果三个操作数中的每一个都是 double-precision floating-point number , 他们每个人的精度都会有一些舍入误差。可以使用函数 EPS 找到此舍入误差的界限。 ,它告诉您从一个 double 到下一个最大 double 的距离。例如,input 表示的相对误差的界限将是 0.5*eps(input),或者它与下一个最大 double 之间的一半。因此,我们可以如下估计三个操作数的一些误差范围:

err_input = 0.5.*eps(input);  %# Maximum round-off error for input
err_C1 = 0.5.*eps(C1);        %# Maximum round-off error for C1
err_C2 = 0.5.*eps(C2);        %# Maximum round-off error for C2

请注意,这些错误可能是正数或负数,因为真实数字可能已向上或向下舍入以将其表示为 double 值。现在,请注意当我们通过将这些误差添加到它们来估计操作数在四舍五入之前的真实值时会发生什么,然后执行 output 的计算:

output = (input+err_input)*(C1+err_C1) + C2+err_C2
%# ...and after reordering terms
output = input*C1 + C2 + err_input*C1 + err_C1*input + err_input*err_C1 + err_C2
%#       ^-----------^   ^-----------------------------------------------------^
%#             |                                   |
%#    rounded computation                      difference

从这里您可以看出,在执行计算之前对三个操作数的精度舍入可能会使我们得到的输出改变差异。此外,当值 output 被舍入以将其表示为 double 值时,还会有另一个舍入误差源。

因此,您可以看到要充分估计由精度舍入引入的误差,它比您想象的要复杂得多。

关于algorithm - 生成算法舍入错误报告的 MATLAB 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4193086/

相关文章:

algorithm - n 叉树和 m 叉树之间有什么区别吗?

java - 在包含 2 个指定顶点的无向图中查找最短循环

matlab - 如何计算每个网格单元的面积?

python - Matlab filter() 与 SciPy lfilter()

c++ - 无法构建 mex 文件

java - 警告 :oejuc. 抽象生命周期 :FAILED?

matlab - 如何在 Matlab 中获取科学记数法的指数

c# - 如何使用友好的名称通过 Web API 设置层次结构值,而不将结构本身暴露给用户?

python - 在 Python 中对具有不同运算符的列表求和

algorithm - 矩阵与其转置矩阵的乘积