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
实例。