Posted on 2010-07-05 20:19
王之昊 閱讀(202)
評論(0) 編輯 收藏 引用 所屬分類:
pku
寫好計(jì)算幾何很多時(shí)候要養(yǎng)成一個(gè)好習(xí)慣。
比如求比浮點(diǎn)數(shù) f 小的最小的整數(shù),認(rèn)為絕對值差在1e-9的精度內(nèi)兩個(gè)浮點(diǎn)數(shù)是相同的,首先是看 f 是否就是一個(gè)整數(shù), 是則返回 f 。 否則返回 f 的截?cái)唷?這時(shí)如果直接用 floor( f ),很容易忽視這種情況 如0.9,999,999,999。它和 1 在1e-9精度下是相等的。所以答案應(yīng)該是1, 而floor(f) = 0;
又如
Reflections 這道題中的反射,大致是光線從一點(diǎn)射出,射到某個(gè)球上,再反射,再射下一個(gè)球上,重復(fù),直到不再與球相交。
我們假設(shè)前一次反射的球?yàn)閎ase,再求下一個(gè)射到的球的位置時(shí),就不該考慮base,他一定不是我們要求的那個(gè)下一個(gè)球,但如果不先排除base,我們很容易就算到base是下一個(gè)射到的球這樣一個(gè)錯(cuò)誤的答案,這樣模棱兩可的情況如果能在邏輯上排除,盡量排除。
在這些精度問題上要注意小心,更好的辦法就是平時(shí)寫的時(shí)候養(yǎng)成一個(gè)好習(xí)慣。
能邏輯上排除的就不進(jìn)行浮點(diǎn)數(shù)比較,能避免就避免。如果不能避免,一定要加上符號判斷函數(shù)
int D(double x ){ return x < -eps ? -1 : x > eps; }