Posted on 2010-07-05 20:19
王之昊 阅读(187)
评论(0) 编辑 收藏 引用 所属分类:
pku
写好计算几何很多时候要养成一个好习惯。
比如求比浮点数 f 小的最小的整数,认为绝对值差在1e-9的精度内两个浮点数是相同的,首先是看 f 是否就是一个整数, 是则返回 f 。 否则返回 f 的截断。 这时如果直接用 floor( f ),很容易忽视这种情况 如0.9,999,999,999。它和 1 在1e-9精度下是相等的。所以答案应该是1, 而floor(f) = 0;
又如
Reflections 这道题中的反射,大致是光线从一点射出,射到某个球上,再反射,再射下一个球上,重复,直到不再与球相交。
我们假设前一次反射的球为base,再求下一个射到的球的位置时,就不该考虑base,他一定不是我们要求的那个下一个球,但如果不先排除base,我们很容易就算到base是下一个射到的球这样一个错误的答案,这样模棱两可的情况如果能在逻辑上排除,尽量排除。
在这些精度问题上要注意小心,更好的办法就是平时写的时候养成一个好习惯。
能逻辑上排除的就不进行浮点数比较,能避免就避免。如果不能避免,一定要加上符号判断函数
int D(double x ){ return x < -eps ? -1 : x > eps; }