浮点数的另一个教训
在一个之前的帖子我讨论了浮点计算的准确性的问题。今天我有另一个例子,分享,一直潜伏在映射工具产品。的问题是函数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;
评论?
你曾经有过类似的问题,一个看似无辜的代码表达会导致错误的结果吗?你发现了这个规律,又是怎么解决的,好吗?我很想听听你的想法在这里。
评论
留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。