代码之家  ›  专栏  ›  技术社区  ›  homemmakako

(Haskell)除法产生整数而不是双精度[重复]

  •  0
  • homemmakako  · 技术社区  · 7 年前

    我正在尝试使用haskell编写一个简单的代码来获得PI的近似值。然而,程序似乎预测除法的结果是一个整数,即使除法从来都不精确(同样,它是PI)。。。。至少我是这么理解的:P

    代码如下:

    divpi :: Integer -> Double
    divpi k = (((fatc (6*k)) * ((545140134*k) + 13591409))/((fatc (3*k)) * (pot (fatc k) 3) * (pot (-262537412640768000) k)))
    

    fatc是阶乘(fatc数),pot是整数指数(pot基指数)

    错误消息:

    ERROR file:.\haskel.hs:33 - Type error in explicitly typed binding
    *** Term           : divpi
    *** Type           : Integer -> Integer
    *** Does not match : Integer -> Double
    

    如有必要, here 是整个代码

    1 回复  |  直到 7 年前
        1
  •  1
  •   Silvio Mayolo    7 年前

    在哈斯克尔, / 工作于 Fractional 类型。然而你的 fatc pot 返回整数。与C不同,Haskell永远不会在任何类型之间进行隐式转换,因此我们需要使用 fromInteger 从中获取非整数值。

    divpi :: Integer -> Double
    divpi k = (fromInteger ((fatc (6*k)) * ((545140134*k) + 13591409)) / fromInteger ((fatc (3*k)) * (pot (fatc k) 3) * (pot (-262537412640768000) k)))
    

    此外,作为将来的注意事项,当您有这样复杂的算法时,请考虑使用 where let 创建一些中间变量。除了使内容更具可读性之外,您还可以获得更好的错误消息。

    推荐文章