2013-02-13 27 views
3

我正在進行一些幾何計算,這將需要我根據雙精度來比較座標。我通常通過加入一些人爲的epsilon來處理這種情況下的浮點不準確性。這很常見,並且有很多關於此主題的信息。帶有內置epsilon的包裹式浮點型

http://floating-point-gui.de/errors/comparison/

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

我的想法是雙層包裝的NEWTYPE和使用小量實施公式和Ord。這似乎是一個非常明顯的概念,它或者已經完成,並且必須位於Hackage的圖書館中,或者我還沒有想到的概念出現了明顯的錯誤。所以我的問題,有誰知道現有的模塊,包含類似的類型(我做了一個快速搜索,沒有看到任何東西)?或者,這是一個虛假的想法?謝謝。

+3

該方法的一個問題是平等不再是傳遞性的。儘管如此,這並不是一個破壞交易的方式。 – 2013-02-13 18:15:21

+0

'Eq'的'(==)'是否被認爲是傳遞的任何地方?也許這是在某個地方的重寫規則。我剛剛查看了2010年的報告,至少在那裏沒有提到。 – 2013-02-13 19:13:01

+0

您是在尋找[interval arithmetic](https://www.google.com/search?q=interval+arithmetic&ie=UTF-8&oe=UTF-8&hl=zh-CN&client=safari)嗎? – 2013-02-14 15:04:15

回答

3

這不是一個虛假的想法。一種方法是創建允許您編寫浮點表達式的類型,爲了進行評估,需要一段配置數據 - 即epsilon的值。這將非常像Reader monad。

一種很好的方法解決這個問題中給出:

http://okmij.org/ftp/Haskell/types.html#Prepose

和GHC的高效實現可對在反射包hackage找到。

+1

另一種可能性就是創建一個帶有新運算符的新類型來進行近似比較:'〜=','〜<', '~>' - 那麼您可以避免使用'newtype'來包裝標準類型。要使用隱式參數(http://www.haskell.org/haskellwiki/Implicit_parameters)可能需要查看可配置的epsilon,與Prepose文章中列出的從屬打字方法相比,它要少得多。 – ErikR 2013-02-14 06:27:43

+0

這正是我最終做的。我忘記了newtype需要在模式匹配等中使用這兩個構造函數。這個應用程序有點笨拙。謝謝。 – MFlamer 2013-02-14 16:41:59