Haskell 带内置epsilon的包装浮点类型
我正在做一些几何计算,需要我比较基于双精度的坐标。我通常通过加入一些人工ε来处理这种情况下的浮点误差。这是很常见的,关于这个主题有很多信息Haskell 带内置epsilon的包装浮点类型,haskell,floating-point,Haskell,Floating Point,我正在做一些几何计算,需要我比较基于双精度的坐标。我通常通过加入一些人工ε来处理这种情况下的浮点误差。这是很常见的,关于这个主题有很多信息 我的想法是将Double包装成一个新类型,并使用epsilon实现Eq和Ord。这似乎是一个如此明显的概念,要么它已经完成,必须在黑客库中,要么我还没有想到这个概念有什么明显的错误。那么我的问题是,有人知道现有的模块包含类似的类型吗(我快速搜索了一下,没有看到任何内容)?或者,这是一个虚假的想法吗?谢谢。这不是一个虚假的想法。一种方法是创建允许您编写浮点
我的想法是将Double包装成一个新类型,并使用epsilon实现Eq和Ord。这似乎是一个如此明显的概念,要么它已经完成,必须在黑客库中,要么我还没有想到这个概念有什么明显的错误。那么我的问题是,有人知道现有的模块包含类似的类型吗(我快速搜索了一下,没有看到任何内容)?或者,这是一个虚假的想法吗?谢谢。这不是一个虚假的想法。一种方法是创建允许您编写浮点表达式的类型,为了进行计算,浮点表达式需要一段配置数据,即epsilon的值。这将很像读卡器monad 下面给出了解决此问题的好方法:
GHC的一个有效实现可以在反射包中的hackage上找到。这种方法的一个问题是平等不再是可传递的。不过,这不一定是交易的破坏者。
Eq
的(==)
在任何地方都可以传递吗?也许在某个地方有重写规则。我刚看了2010年的报告,里面根本没有提到。你在找吗?@Eric,那将是最终的陈述。对于这个特定的实例,可能有点过头了。谢谢我不久前读过一些关于区间算术的文章,这是一个很好的提醒。另一种可能是创建一个新的类型类,使用新的运算符进行近似比较:~=
,~这正是我最后要做的。我忘记了newtype需要在模式匹配等方面同时使用两个构造函数。对于这个应用程序来说有点笨拙。谢谢