檢查source code給我這個(我剪下實現的範圍)
bool approxEqual(T, U, V)(T lhs, U rhs, V maxRelDiff, V maxAbsDiff = 1e-5)
{
if (rhs == 0)
{
return fabs(lhs) <= maxAbsDiff;
}
static if (is(typeof(lhs.infinity)) && is(typeof(rhs.infinity)))
{
if (lhs == lhs.infinity && rhs == rhs.infinity ||
lhs == -lhs.infinity && rhs == -rhs.infinity) return true;
}
return fabs((lhs - rhs)/rhs) <= maxRelDiff
|| maxAbsDiff != 0 && fabs(lhs - rhs) <= maxAbsDiff;
}
最後一行是我們將要研究:
return fabs((lhs - rhs)/rhs) <= maxRelDiff
|| maxAbsDiff != 0 && fabs(lhs - rhs) <= maxAbsDiff;
換句話說,如果編號是要麼相對不同決不該函數返回true多於不超過maxAbsDiff
所以使用0.01
的maxRelDiff
一個的maxRelDiff
OR 絕對不同因子(或1E-2
)與2(十進制)數字的精確度進行比較
並且使用maxAbsDiff
不同於0允許接近於0的數字被認爲是相等的,即使相對差異更大比maxRelDiff
編輯:基本上先決定比較如何準確的必須,並選擇您maxRelDiff
基於這一點,那麼在什麼時候決定應該在數等於0
與註釋的例子:
approxEqual(1+1e-10, 1.0, 1e-10, 1e-30)
approxEqual(1+1e-10, 1.0, 1e-9, 1e-30)
這比較接近1,因此maxRelDiff
勝過這裏的價值觀和選擇任何maxAbsDiff
(低於maxRelDiff
)不會改變任何東西
approxEqual(0, 1e-10, 1e-10, 1e-30)
approxEqual(0, 1e-9, 1e-9, 1e-30)
這比較接近0值設置爲0,因此RelDiff(fabs((lhs - rhs)/rhs)
)將1和maxAbsDiff
勝過
你計算'絕對difference',並將其與對'0.10'。你不能只依靠絕對的差異,而你的'0.10'在大多數情況下都不夠小。 – Arlen 2012-01-02 02:36:36
如果f1 = 0.01和f2 = 0.03,你有相當大的相對差異,但你的表達會說「他們是相同的」。 – 2012-01-02 04:02:30
爲了某些代碼的目的,這是我想要的行爲。 – 2012-01-02 16:21:03