Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Floating Point - Fatal编程技术网

Haskell 哈斯凯尔浮标上的昂贵操作

Haskell 哈斯凯尔浮标上的昂贵操作,haskell,floating-point,Haskell,Floating Point,我在Haskell中有一个函数,它对2个(大的)浮点列表进行操作,并返回一个浮点列表。我从一个简单的求和开始,现在正在寻找一个更复杂的运算,需要更长的时间。没错,我真的想慢一点 我尝试了以下方法: listOp :: (Floating a) => [a]->[a]->[a] listOp _ [] = [] listOp [] _ = [] listOp (x:xs) (y:ys) = (sqrt ((x/y) / (y/x))) : (listOp xs ys) 由于我的

我在Haskell中有一个函数,它对2个(大的)浮点列表进行操作,并返回一个浮点列表。我从一个简单的求和开始,现在正在寻找一个更复杂的运算,需要更长的时间。没错,我真的想慢一点

我尝试了以下方法:

listOp :: (Floating a) => [a]->[a]->[a]
listOp _ [] = []
listOp [] _ = []
listOp (x:xs) (y:ys) = (sqrt ((x/y) / (y/x))) : (listOp xs ys)
由于我的(Win32)内存限制,使用Double时列表的长度限制为400万。内容是随机生成的,并强制在列表上进行评估

生成每个输入列表大约需要5秒钟。我尝试过各种操作,寻找昂贵的操作
x+y
x*y
(x**y)**(y**x)
,但结果列表总是在1秒以下计算(除非我的计时代码不正确)

对于我可以在
x
y
上使用的昂贵操作,有什么建议吗?trig函数(sin、cos等)是很好的候选函数吗

谢谢

\x y -> unsafePerformIO (threadDelay 1000000 >> return x + y)
为了CPU-y的好处,忙循环

loop 0 = ()
loop x = loop (x-1)
\x y -> loop 1000000000 `seq` x + y

一个很好的可调的昂贵函数是。Ackermann函数的运行时间增长非常快——它的增长速度比指数函数快。

只需迭代一些函数,如sin N次,您可以调整N,直到它足够慢。这将使FPU保持忙碌,而您似乎出于某种原因需要这样做

你为什么不利用懒惰来让列表流出来呢?这样,您就可以在恒定内存中获得任意长的列表。您对生成的列表做了什么?除非确保强制列表中的每个元素,否则不会发生任何事情。顺便说一句,使用
zipWith
而不是滚动你自己的。@fuzzxl我有理由不想要懒散的列表-我不想用无关紧要的讨论来搅乱局面,所以我把它们忽略了。@augustss我正在强制列表中的每一个元素。谢谢你的
zipWith
提示-可能会在最后出现。你能告诉我们更多的问题背景吗?鉴于提供的信息,我想不出任何可能的观点。谢谢,但我正在寻找一个真正昂贵的操作,它将使CPU忙于做一些工作。我应该说得很清楚,对不起。更新了答案以限制您的CPU。在更高的优化级别(即那些值得进行基准测试的级别)上,这可能优化到
seq()(x+y)
,然后优化到
x+y
“比指数更快”在这里有点轻描淡写。我很确定Ackermann函数对于OP的需求来说是多余的。