Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 带内置epsilon的包装浮点类型_Haskell_Floating Point - Fatal编程技术网

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需要在模式匹配等方面同时使用两个构造函数。对于这个应用程序来说有点笨拙。谢谢