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应该用于符号任务,比如做线性代数作业。