首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当将复制的值与原始值进行比较时,是否存在精度问题?

当将复制的值与原始值进行比较时,是否存在精度问题?
EN

Stack Overflow用户
提问于 2016-05-05 01:59:20
回答 1查看 42关注 0票数 0

考虑以下工作流程:

代码语言:javascript
运行
复制
A = [2/3 exp(1) 5];

match = interp1(A, A, 2, 'next');

第二个命令查找A的值,该值在2之后。因此,match等于exp(1)

我有两个问题:

  1. 我可以期望A == match总是计算为[0 1 0]吗?
  2. 如果是B = [exp(1) exp(1) exp(1)]B == match的结果是什么?

如果exp(1)被其他非理性或超验数所取代,答案会改变吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-05 02:15:56

  1. 当复制内存中的值时,存在的任何浮点错误都将被复制,因为所有复制操作都只是将位复制到内存中的一个新位置,并且没有实际执行算术,也不会引入新的精度错误。因此,浮点数(带有精度错误)与该数字的精确副本之间的比较总是相等的。 尽管如此,您的示例假设interp1中下一个邻居插值的实现只是复制数据。虽然这在当前版本中可能是正确的,但这肯定是可以更改的。如果在将来,interp1被重写为执行一些下邻居插值的浮点算法,那么您的比较就会意外地失败。因此,即使在这种情况下,我也不愿意使用==进行比较。
  2. 浮点错误(对于相同的计算)的差异通常是由不同的类型和操作顺序引起的。对于您的exp(1)示例,可以预期内置的exp函数将执行相同的操作顺序,因此,对于相同(相同)的输入,输出值都将具有相同的精度错误。正因为如此,您的比较将产生[1 1 1]。 再一次,这是一个关于内置函数的内部结构的假设,最终可能会回来咬你。对于这种比较,我将避免使用==,只是为了确保您的代码函数按照预期的方式运行,而不管函数的内部实现如何。

更新

我可能不会像您展示的那样进行比较,试图识别下一个邻居的位置,而只是做下面的操作,以获得相同的结果。

代码语言:javascript
运行
复制
ind = find(A > 2);

或者如果你真的需要一个逻辑数组。

代码语言:javascript
运行
复制
[0 diff(A > 2) == 1]

或者,您可以在A中找到与匹配最接近的值,如下所示:

代码语言:javascript
运行
复制
[~, ind] = min(abs(A - match))

更新2

在注释中提供的示例

代码语言:javascript
运行
复制
C = [exp(1) exp(1) exp(1) 1 1 pi*4 pi*4 pi*4 pi*4];
C == mode(C);

您正在进行(合理的)假设,即mode返回被发现为该模式的值的确切副本。尽管在上面的比较中,问题在于您还假设输入数组中的所有pi*4都是完全相等的。因此,基本上,如果mode返回一个确切的副本,则比较C == mode(C)将至少返回1次匹配,但可能返回多达4次匹配,这取决于所有4*pi条目的“相等”程度。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37041084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档