【发布时间】:2020-04-04 04:05:42
【问题描述】:
我正在使用 matlab。我有一个函数f(x),我想将f(x) 应用于一组值。所以我写了2个代码。第一个代码是一个简单的 for 循环。在某一时刻x0,在这个for循环中,我找到了f(x0)=1.0000,然后我使用了f(x0)-1=-4.7684e-07。
我的第二个代码是在 f(x) 上使用 arrayfun。而在同样的输入值x0,我发现结果是1.0000但是arrayfun(f,x0)-1=4.7684e-07!
这个错误4.7684e-07 看起来很小。但是 for 循环给了我一个低于 1 的数字,arrayfun 给了我一个高于 1 的数字。这对我的工作来说确实是一个很大的不同,因为我随后的计算很大程度上取决于这个数字是低于 1 还是高于 1,因为这个数字应该是一个概率。
现在我的问题是:为什么arrayfun 有这样的问题?我的代码中没有随机数,为什么arrayfun 生成的结果与 for 循环不同?我应该相信哪一个?有没有办法避免这种精度问题?请注意,在这段代码中,我所有的变量都是single 类型。这是造成问题的原因吗?
【问题讨论】:
-
这看起来确实很奇怪,因为
arrayfun就像引擎盖下的一个循环。 MVE 怎么样? -
@max 让我试试看能不能修改我原来的代码。
-
也许差异已经更早并且其中一个 x0 不完全相同?调试代码时,请确保查看 17 位有效数字。这比将显示的 15 个
format long多。可用于打印的代码:stackoverflow.com/a/35626253/2732801 -
您与
single合作有什么原因吗?这确实不是很精确。 -
请阅读minimal reproducible example。如果我们不知道您在做什么,我们就无法猜测问题出在哪里。你的描述很丰富,但并不完整。展示你做了什么,不要说你做了什么!