Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何计算双倍数?_Haskell_Double_Precision - Fatal编程技术网

Haskell 如何计算双倍数?

Haskell 如何计算双倍数?,haskell,double,precision,Haskell,Double,Precision,我如何计算Doubles的总和?我原以为sum会开箱即用,而当我只使用类型推断时,它确实似乎是这样,但当我给出一个类型签名,将输出类型固定为Double时,总和就无限大了 这不起作用: doubles :: Int -> Int -> Double doubles maxk maxn = sum [1/(fromIntegral(i*(j+1)^(2*i)))|i<-[1..maxk],j<-[1..maxn]] 但是,如果没有类型签名,相同的代码: doubles

我如何计算
Double
s的总和?我原以为
sum
会开箱即用,而当我只使用类型推断时,它确实似乎是这样,但当我给出一个类型签名,将输出类型固定为
Double
时,总和就无限大了

这不起作用:

doubles :: Int -> Int -> Double
doubles maxk maxn =  sum [1/(fromIntegral(i*(j+1)^(2*i)))|i<-[1..maxk],j<-[1..maxn]]
但是,如果没有类型签名,相同的代码:

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

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

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

这里a2是具有积分实例的任何类型。Int和Integer都实现整数。整数是一种任意精度类型:它将容纳任何数字,无论大小,直到您的计算机内存的限制。Int不是。例如:

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

(10::Int)^100==0

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


当没有显式类型声明时,Haskell将假定任何自然数文本实际上都是整数。这就是为什么第二个函数对整数进行运算,结果更好

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

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

这里a2是具有积分实例的任何类型。Int和Integer都实现整数。整数是一种任意精度类型:它将容纳任何数字,无论大小,直到您的计算机内存的限制。Int不是。例如:

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

(10::Int)^100==0

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


当没有显式类型声明时,Haskell将假定任何自然数文本实际上都是整数。这就是为什么第二个函数对整数进行运算,结果更好

您能更清楚地说明什么不起作用以及为什么不起作用吗?这两个代码看起来是一样的。我已经试着让你问的更清楚一点。如果我误解了什么让你困惑,请随意更改问题的任何部分。你能更清楚地说明什么不起作用以及为什么不起作用吗?这两个代码看起来是一样的。我已经试着让你问的更清楚一点。如果我误解了什么让你困惑,请随意更改问题的任何部分。
doubles maxk maxn =  sum [1/(fromIntegral(i*(j+1)^(2*i)))|i<-[1..maxk],j<-[1..maxn]]
*Main> doubles 20 1500
0.692481179869307