程序的边界情况(有时候也叫退化情况),不是经常遇见。有些边界情况对结果影响不大,有些却能产生莫名其妙的结果。只要用的人多了,一般都能遇见。有些边界情况很常见。
sqrt:这是一个求二次根号的数学函数,要求输入是一个非负数。有些理论上看起来的非负数,有时候也会出错。
- 1 - cos(theta) * cos(theta):这个式子用于已知cos(theta),求sin(theta)的时候
- 1 - vec0 * vec1: vec0和vec1是两个单位向量,它俩的内积有可能大于1
- 线段L在一个方向上的投影,也是一条线段Pro(L)。Pro(L)的长度有可能大于L的长度
对于输入有要求的函数,最好检查一下输入的范围,避免输入越界。
精度溢出:求两个向量V0和V1的夹角 - V0 * V1/ (||V0|| * ||V1||)。这么写有可能产生精度溢出。可以先单位化向量再求角度。
数组std::vector访问元素时,最好用at,不要用[]。有时候数组越界访问,会产生莫名奇妙的结果。比如,访问的元素作为一个迭代方法的初值,那么,数组越界的时候,有时候迭代会收敛,有时候又不收敛。很难调试。一般情况at并不会产生性能下降。
没有什么情况是一定不会发生的,出错的情况都是作者没有想到的情况。所谓异常,都是意料之外的情况。避免盲目自信,可以有效减少边界情况出错的几率。
网友评论