在Haskell中将double转换为GLfloat

4

我想将Double转换为GLfloat。我想用它进行比较。

xM <- newIORef 0.0
zM <- newIORef 0.0
mobs <- newIORef []
mapM_ (\x -> colision x xM) mobs

Mobs中充满了一个方法。
colision mob xC = do
  xcama <- get xC
  --zcama <- get zC
  let menor = mob!!0
  let mayor = mob!!7
  --if xm>= xmin && xm <= xmax && zm >= zmin && zm <= zmax  then renderText (1, (-1.4)) $ "Dead"
  --else renderText (1, (-1.4)) $ "Warning..."
  renderText (1, (-1.4)) $ "Warning..."

当我尝试编译时,它显示以下错误:

"无法匹配类型'Foreign.C.Types.CDouble'和'Foreign.C.Types.CFloat' 期望类型:GLfloat

实际类型:GLdouble

-----解决方案:------

我使用了这段代码:

import GHC.Float
  d2f = realToFrac :: GLdouble -> GLfloat

您不需要import GHC.Float,因为realToFrac是标准的Haskell函数,从Prelude重新导出。 - Ørjan Johansen
2个回答

9

在IT技术中,将不同浮点数类型(以及一些其他类型,如Rational)之间进行转换的通用函数是realToFrac


0

更快:

   import Unsafe.Coerce(unsafeCoerce)
   import GHC.Float(double2Float)
   doubleToGF = unsafeCoerce . double2Float :: Double -> GLfloat

我一直希望能用Data.Coerce让这个过程更加安全,但目前还没有实现


我没有在源代码中查找过,但理论上它不会更快,因为realToFrac总是会在编译时针对这些原始类型使用重写规则进行重写。 - artem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接