【问题标题】:recommended way to convert Double -> Float in Haskell在 Haskell 中转换 Double -> Float 的推荐方法
【发布时间】:2015-07-13 19:10:59
【问题描述】:

Double -> Float 的惯用方式是什么?

uncurry encodeFloat . decodeFloat吗?

(我使用的是gloss,这需要浮点数)

找到这些问题的答案的推荐方法是什么?

我正在尝试this hoogle query,但答案都非常无用 (试试看 - 列表顶部有 unsafeCoerce

【问题讨论】:

  • 这将是一个痛苦的转变。
  • @Jefffrey:你是说任何这样的转换都会很痛苦,或者那个特定的实现是痛苦的?
  • 我不确定,因为我记得 Float 在 Haskell 中是“特殊的”,我记得被告知要像瘟疫一样避免它,但一般来说,“double”表示双精度浮点number,一般为64位,而“float”为单精度浮点数,一般为32位。如果是这种情况,您可以清楚地看到这是一个损失转换。
  • @Jefffrey : 丢失在这里无关紧要,因为它只是屏幕坐标

标签: haskell floating-point coercion


【解决方案1】:

使用@987654321@ :: (Real a, Fractional b) => a -> b

它可以从任何实数类型(如IntFloatDouble)转换为任何小数类型(如FloatDoubleRational)。

请注意,即使此函数的一般定义 (fromRational . toRational) 通过 Rational 类型进行缓慢转换,there are rewrite rules 使用更有效的实现来实现 FloatDouble 之间的转换。

【讨论】:

  • 这是标准方式。应该注意的是,直接实现效率很低,因为它使用Rational 作为中间体。这当然可以被优化掉,但我不确定 GHC 的可靠性如何——在代码中找不到相应的SPECIALIZEation。
  • @leftaroundabout:Found them。它们被实现为重写规则,在本例中为 GHC.Float.float2Double,它只是 float2Double# 原语的包装。
  • 仍然想知道..为什么hoogle找不到这个realToFrac
  • @d8d0d65b3f7cf42:它确实返回了列表中的大约 50 个项目。看起来它在对结果进行排名时可能没有考虑实例,但是,因为它给出了与例如类似的排名。 fromIntegral 即使没有 Integral 实例 Double
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多