Posted on 2010-07-05 20:19
王之昊 閱讀(198)
評論(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; }