Types 朱莉娅的复数运算,奇怪的结果?

Types 朱莉娅的复数运算,奇怪的结果?,types,julia,linear-algebra,Types,Julia,Linear Algebra,我在朱莉娅做一些简单的线性代数练习 下面是如何定义变量的 H = (1/sqrt(2)) * [1.0 + 0.0im 1.0 + 0.0im; 1.0 + 0.0im -1.0 + 0.0im;] X = [0.0im 1.0 + 0.0im; 1.0 + 0.0im 0.0im;] H计算到 2×2 Array{Complex{Float64},2}: 0.707107+0.0im 0.707107+0.0im 0.707107+0.0im -0.707107+0.0im

我在朱莉娅做一些简单的线性代数练习

下面是如何定义变量的

H = (1/sqrt(2)) * [1.0 + 0.0im 1.0 + 0.0im; 1.0 + 0.0im -1.0 + 0.0im;]
X = [0.0im 1.0 + 0.0im; 1.0 + 0.0im 0.0im;]
H计算到

 2×2 Array{Complex{Float64},2}:
 0.707107+0.0im   0.707107+0.0im
 0.707107+0.0im  -0.707107+0.0im
 2×2 Array{Complex{Float64},2}:
 0.0+0.0im  1.0+0.0im
 1.0+0.0im  0.0+0.0im
X计算到

 2×2 Array{Complex{Float64},2}:
 0.707107+0.0im   0.707107+0.0im
 0.707107+0.0im  -0.707107+0.0im
 2×2 Array{Complex{Float64},2}:
 0.0+0.0im  1.0+0.0im
 1.0+0.0im  0.0+0.0im
单位矩阵定义为I=[1.0+0.0im 0.0+0.0im;0.0+0.0im 1.0+0.0im;]

现在X*X和H*H都返回

正如所料。但是

I == X * X # returns true

I == H * H # returns false
X*X-I返回

正如预期的那样,而对H的处理也是一样的

  2×2 Array{Complex{Float64},2}:
 -2.22045e-16+0.0im           0.0+0.0im
          0.0+0.0im  -2.22045e-16+0.0im
朱莉娅对我来说是个新手。为什么会发生这种情况?

这是因为sqrt2是一个浮点数,因此sqrt2*sqrt2不等于2

解决这个问题的一种方法是为代数数定义一种新类型,如中所示

例如:

sqrt(AlgebracNumber(2))^2 == 2
这是因为sqrt2是一个浮点数,因此sqrt2*sqrt2不等于2

解决这个问题的一种方法是为代数数定义一种新类型,如中所示

例如:

sqrt(AlgebracNumber(2))^2 == 2

切勿将浮点值与==进行比较,请使用≈ isapprox,对于两个比较都返回true。Julia还有LinearAlgebra。I表示标准库中任何大小的单位矩阵。切勿将浮点值与==,使用≈ isapprox,对于两个比较都返回true。Julia还有LinearAlgebra。我表示标准库中任何大小的单位矩阵。也许值得指出的是,除非你做了非常特别的事情,浮点数的不精确性是不需要担心的,使用浮点数就足够了,不需要像AlgebracNumber这样的特殊数字类型。算法不应该对这样的事情敏感,而应该重写代码以使用,例如“近似比较而不是绝对比较”等。正如@fredrikekre指出的,定义新的数字类型不是进行数值计算的有效方法。AlgebracNumber应该用于符号任务,比如做线性代数家庭作业。也许值得指出的是,除非你正在做一些非常特殊的事情,否则浮点不精确性不是你需要担心的事情,使用浮点数就足够了,不需要像AlgebracNumber这样的特殊数字类型。算法不应该对这样的事情敏感,而应该重写代码以使用,例如“近似比较而不是绝对比较”等。正如@fredrikekre指出的,定义新的数字类型不是进行数值计算的有效方法。AlgebracNumber应该用于符号任务,比如做线性代数作业。