Haskell修复:两个数组的内积结果是错误的

时间:2014-12-09 08:14:50

标签: haskell repa

import Data.Array.Repa
import Data.Vector.Unboxed hiding(zipWith)
import Prelude hiding(zipWith,replicate)

dotp :: Array U DIM1 Float -> Array U DIM1 Float -> IO Float
dotp x y =  sumAllP $ zipWith (*) x y

x = fromUnboxed (Z:.20000000) $ replicate 20000000 1 
y = fromUnboxed (Z:.20000000) $ replicate 20000000 1

main = (dotp x y) >>= print

使用ghc -O2 -threaded test.hs

编译

但是,当我使用./test +RTS -N1

执行可执行文件时

结果为1.6777216e7

./test +RTS -N2或更多核心

结果是正确的:2.0e7

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:3)

您使用Float代替DoubleFloat没有足够的有效数字(~7)用于您的用例:

λ> (1.6777216e7 :: Float) + 1
1.6777216e7

切换到Double。如果您的所有值都是不可分的,请考虑Int(或来自Data.IntIntxx)或Word(来自Data.Word)。

另见: