- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有兴趣使用或创建一个脚本来获取算法中的错误舍入报告。我希望脚本或类似的东西已经完成......我认为这对数字电子系统设计很有用,因为有时需要研究精度误差如何取决于设计中考虑的小数位数。该脚本将使用 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/
我在 ASP.NET MVC 中有一个发票页面。 我正在计算 GST。 在 javascript 中这是结果。 165.45 * 0.1 = 16.544999999999998 在 C# 中我得到
在 JavaScript 中,我想将其减少到小数点后 5 位。不过,我不能简单地四舍五入并得到 0.03085,我需要进一步查看数字并将所有数字向上舍入,以便得到 0.03086。 输入:0.0308
有人可以解释为什么 R 这样做吗?在整数值上舍入最大值和最小值似乎非常有缺陷。 summary(1:1283932) Min. 1st Qu. Median Mean 3rd Qu.
所以基本上我正在做一个物理实验,在我的表格中,我希望我的数据四舍五入到与误差相同的精度,四舍五入为 1 sig fig。 例如,如果我有以下内容: angle signif(c(1.111,2.22
考虑以下 C# 代码... double x = Math.Round(72.6d, 2, MidpointRounding.ToZero); double y = Math.Round(82.6d,
我正在学习 BigDecimal,我希望它检索我输入的确切数字,以下代码正在处理该数字,我不知道为什么 public static BigDecimal parseFromNumberString(S
double y1 = 0; double y2 = 0; double i = 0.025; double n = 2; double h1 = 2000; double h2 = 4000
所以在下面的一组代码中,出于某种原因我得到了完全错误的答案...... import java.util.*; import java.io.*; import java.lang.*; import
在 Python 中,我想将两个数字相除,如果答案不是整数,我希望将数字四舍五入为上面的数字。 例如 100/30 不是给 33.3 而是给 4。谁能建议如何做到这一点?谢谢。 最佳答案 您可以使用
我需要对一个 float 进行四舍五入。例如 4.00011 。内置函数 round() 总是在数字 > .5 时向上舍入,在 = 0 val *= 10 ** precision r
我的代码: // Convert SATOSHIS to BITCOIN static double SATOSHI2BTC(const uint64_t& value) {
我想让我的 tableView 看起来像这样: 我有问题。只有在我点击单元格后,我的右角才会变圆。当 View 出现时,它看起来像这样: 点击后像这样: 这是我的代码: extension UITab
这个问题在这里已经有了答案: Precision String Format Specifier In Swift (31 个答案) 关闭 8 年前。 除了覆盖当前转换为字符串的方法之外,是否有一种
>>> a = 0.3135 >>> print("%.3f" % a) 0.314 >>> a = 0.3125 >>> print("%.3f" % a) 0.312 >>> 我期待 0.313
我有自动将输入字段加在一起的 javascript 函数,但是添加像 1.35 + 1.35 + 1.35 这样的数字会得到 4.050000000000001 的输出,这只是一个例子。如何将总数四舍
这可能是 x86 FPU 专家的问题: 我正在尝试编写一个生成范围 [min,max] 内的随机浮点值的函数。问题是我的生成器算法(浮点 Mersenne Twister,如果你好奇的话)只返回 [1
我一定错过了一些明显的东西。 select CEILING(85/30) = 2 85/30 = 2.83333 我希望该值为 3。 CEILING 函数不应该为我取整吗? 最佳答案 尝试 SELEC
我有一个关于 eclipse rcp 中的 ctabfolders 的问题。我创建了一个 e4 RCP 应用程序,其中包含一个包含堆栈部分容器的窗口,其中包含一个堆栈。该堆栈包含 1 个部分。在这一部
Closed. This question needs details or clarity。它当前不接受答案。
我读过其他一些帖子,它们似乎对其他人有用,但当我尝试它们时,它们不起作用。我刚刚开始学习Java编程,我似乎不明白如何四舍五入。 我试过了 answer = input * input; answer
我是一名优秀的程序员,十分优秀!