Cover an Arc

Posted on 2010-07-05 20:19 王之昊 阅读(184) 评论(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; }

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 26, comments - 7, trackbacks - 0, articles - 17

Copyright © 王之昊