我正忙着使用Haskell来实现一些量子变换矩阵。我有一个函数,用于通过构建逆矩阵和伴随矩阵然后测试它们来测试方阵是否是单一矩阵。
该函数如下所示,其中 wrap 是一个简单的函数,用于测试从 inverse 返回的Either值。
isUnitary :: [[Copmlex Double]] -> Bool
isUnitary lists = let mat = fromLists lists --Create matrix from lists
conjugateTranspose = fmap conjugate $ Data.Matrix.transpose mat --Conjugate Transpose Matrix
inverseMat = debug("ConjugateTranspose: \n" ++ show conjugateTranspose ++ "\n")
wrap $ inverse mat --The inverse matrix
in if (conjugateTranspose) == inverseMat then debug("InverseMat: \n" ++ show inverseMat ++ "\n")
True
else debug("InverseMat: \n" ++ show inverseMat ++ "\n")
False
对于一些简单的测试矩阵,它可以正常工作,在获得如下所示的矩阵时返回True:
ConjugateTranspose:
( 1.0 :+ (-0.0) 0.0 :+ (-0.0) )
( 0.0 :+ (-0.0) (-1.0) :+ (-0.0) )
InverseMat:
( 1.0 :+ 0.0 0.0 :+ 0.0 )
( 0.0 :+ (-0.0) (-1.0) :+ (-0.0) )
我的问题是函数为使用((1 / sqrt(2):+ 0)和((-1 / sqrt(2)):(+ 0))
ConjugateTranspose:
( 0.7071067811865475 :+ (-0.0) 0.7071067811865475 :+ (-0.0) )
( 0.7071067811865475 :+ (-0.0) (-0.7071067811865475) :+ (-0.0) )
InverseMat:
( 0.7071067811865476 :+ 0.0 0.7071067811865476 :+ 0.0 )
( 0.7071067811865476 :+ 0.0 (-0.7071067811865476) :+ (-0.0) )
什么可能导致第二对矩阵的相等测试失败?有没有更正确的方法让我在代码中显示复数?
答案 0 :(得分:3)
Double
是浮点数,浮点数本质上是不准确的。 ==
将执行完全相等的检查,您可能希望"足够接近"平等检查。
或者,您可以使用1)具有固定精度(例如,或2)无限内存使用的不同数值类型,以获得无限精度。 scientific
和fixed
是一个不错的选择。