罗兰在MATLAB的艺术

把想法变成MATLAB

浮点数的另一个教训

在一个之前的帖子我讨论了浮点计算的准确性的问题。今天我有另一个例子,分享,一直潜伏在映射工具产品。的问题是函数wrapTo180

内容

变通办法

有一个变通办法如果你使用映射与释放R2007b和R2008a工具箱。

数值问题

R2007b和R2008a的实现wrapTo180导致的结果wrapTo180(朗)略微不同即使对于特定的值在这一期间(-180 180)。不同的顺序2 * eps(朗)

测试用例

以下应该评估真正的

朗= 115.8323;

但不喜欢。

isequal(经度,wrapTo180(朗))
ans = 0

这些数量不相等,因为所做的算法:115.8323 + 180 - 180不同于115.8323通过

(朗+ 180 - 180)——朗
ans = 2.8422 e - 014

这恰好是

2 * eps(朗)
ans = 2.8422 e - 014

的代码

这里的代码wrapTo180

类型wrapTo180
函数朗= wrapTo180(朗)% wrapTo180包角的度(-180 180)% % lonWrapped = wrapTo180(朗)封装在经度角,在度,%间隔(-180 180),180年180年和-180年的地图映射到-180年。%(一般来说,奇怪,积极180映射到180的倍数,奇怪,% - 180映射到-180的倍数。)% %也看到wrapTo360 wrapTo2Pi wrapToPi。% 2007年版权MathWorks公司% $修订:1.1.6.2 $ $日期:2007/08/20 16:35:59 $朗= wrapTo360(经度+ 180)- 180;

简单的修理

我们可以跳过的算术运算值,115.8323,已经在这一期间(-180 180)。这是一种很好的方式逻辑索引我们可以替换的代码行。

q =(经度< -180)|(180 <朗);经度(q) = wrapTo360(朗(q) + 180) - 180;

评论?

你曾经有过类似的问题,一个看似无辜的代码表达会导致错误的结果吗?你发现了这个规律,又是怎么解决的,好吗?我很想听听你的想法在这里




使用MATLAB®7.6发表

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。