首页 > 解决方案 > 如何计算双打数?

问题描述

我如何求和Double?我认为sum可以开箱即用,当我只使用类型推断时,它似乎确实如此,但是当我给出一个将输出类型固定为总和的类型签名时Double,总和变得无限!

这不起作用:

doubles :: Int -> Int -> Double
doubles maxk maxn =  sum [1/(fromIntegral(i*(j+1)^(2*i)))|i<-[1..maxk],j<-[1..maxn]]

我看到这种行为:

*Main> doubles 20 1500
Infinity

但是,没有类型签名,相同的代码:

doubles maxk maxn =  sum [1/(fromIntegral(i*(j+1)^(2*i)))|i<-[1..maxk],j<-[1..maxn]]

产生一个明智的答案:

*Main> doubles 20 1500
0.692481179869307

是什么赋予了?

标签: haskelldoubleprecision

解决方案


第二个函数的类型与第一个函数不同。

(分数 a1,积分 a2)=> a2 -> a2 -> a1

这里 a2 是任何具有 Integral 实例的类型。Int 和 Integer 都实现了 Integral。Integer 是一种任意精度类型:它可以容纳任何数字,无论多大,直到机器内存的限制。诠释不是。例如:

(10::整数)^100 == 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000

(10::Int)^100 == 0

第二种情况可能发生在您的第一个函数中。然后1/0 == 无穷大

当没有明确的类型声明时,Haskell 将假定任何自然数文字实际上都是整数。这就是为什么第二个函数对整数进行操作并且结果更好的原因


推荐阅读