【开发日记】计算精度

来源:互联网 发布:c语言字符串格式化 编辑:程序博客网 时间:2024/05/22 01:48

一个异常,用了两天的时间查出原因,原来就是一个开根号运算造成的!其根源是计算底数的时候出现了负数!然后底数的计算是通过图像平方和积分图的a+d-b-c得到的,这一步的结果理所当然的应该是非负的!但结果就出现了负数!最终原因是double的精度问题,某些像素点位置的积分图a+d-b-c值竟然有e-6的误差,然后整个平方和积分图的数量级大概是e+10,刚好是double的有效数字精度16位!这说明a+d和b-c的值非常相近(相差小于double的精度了),导致相减时出现误差了!该死的平方和积分图,数量级太TM大了!


开根号的底数必须确保大于0!!!不仅开根号,除数不能为0、exp和log底数不能为0这些都会出现NaN或者Inf值,必须对运算值加上零阈值!


重要的事情说三遍:


可能出现无意义运算的地方必须千万注意!

可能出现无意义运算的地方必须千万注意!

可能出现无意义运算的地方必须千万注意!

0 0
原创粉丝点击