首页 > 解决方案 > Julia 中的复数计算,奇怪的结果?

问题描述

我在 Julia 做一些简单的线性代数练习。

这是变量的定义方式

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

X计算为

 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

2×2 Array{Complex{Float64},2}:
1.0+0.0im  0.0+0.0im
0.0+0.0im  1.0+0.0im

正如预期的那样。但

I == X * X # returns true

I == H * H # returns false

X * X - I返回

 2×2 Array{Complex{Float64},2}:
 0.0+0.0im  0.0+0.0im
 0.0+0.0im  0.0+0.0im

正如预期的那样,而对 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

我对朱莉娅很陌生。为什么会这样?

标签: typesjulialinear-algebra

解决方案


这是因为sqrt(2)它是一个浮点数,因此(sqrt(2)*sqrt(2))不等于 2。

解决此问题的一种方法是为代数数定义一种新类型,如您在AlgebracNumbers.jl中所见。

例子:

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

推荐阅读