Haskell 建议的双精度转换方法->;漂浮在哈斯克尔
惯用的方法是什么Haskell 建议的双精度转换方法->;漂浮在哈斯克尔,haskell,floating-point,coercion,Haskell,Floating Point,Coercion,惯用的方法是什么Double->Float 它是不是未经修正的。解码浮点值 (我正在使用,这需要浮动) 对于这些问题,推荐的解决方法是什么 我试过了,但是答案都没有用 (试一试-它在列表顶部有unsafeCoerce)使用::(实a,分数b)=>a->b 它从任何实数类型(如Int、Float或Double)转换为任何小数类型(如Float、Double或Rational) 请注意,即使此函数的一般定义(fromRational.toRational)通过Rational类型进行缓慢转换,在Fl
Double->Float
它是不是未经修正的。解码浮点值
(我正在使用,这需要浮动)
对于这些问题,推荐的解决方法是什么
我试过了,但是答案都没有用
(试一试-它在列表顶部有unsafeCoerce
)使用::(实a,分数b)=>a->b
它从任何实数类型(如Int
、Float
或Double
)转换为任何小数类型(如Float
、Double
或Rational
)
请注意,即使此函数的一般定义(
fromRational.toRational
)通过Rational
类型进行缓慢转换,在Float
和Double
之间的转换中,哪一个使用了更高效的实现?这将是一个痛苦的转换。@Jeffrey:你是说任何这样的转换都会痛苦,还是说特定的实现是痛苦的?我不确定,因为我记得Float
在Haskell中是“特殊的”,我记得有人告诉我要像瘟疫一样避免它,但一般来说,“double”是指双精度浮点数,通常是64位,而“float”是单精度浮点数,通常是32位。如果是这样的话,你可以清楚地看到这是一个损失转换。@Jeffrey:损失在这里并不重要,因为它只是屏幕坐标,这是标准的方式。但是应该注意的是,直接实现是非常低效的,因为它使用Rational
作为中介。这当然可以优化,但我不确定GHC的可靠性如何-在代码中找不到相应的专门化。@leftaroundabout:。它们被实现为重写规则,在本例中为GHC.Float.float2Double
,它只是float2Double#
原语的包装。。为什么hoogle找不到这个realToFrac
?@d8d0d65b3f7cf42:它确实返回了列表中大约50个项目。在对结果进行排名时,它看起来可能没有考虑实例,但是,因为它给出了类似的排名,例如fromIntegral
,即使Double
没有Integral
实例。