Вычисления комплексных чисел в Юлии, странный результат? - PullRequest
1 голос
/ 13 февраля 2020

Я занимался простой практикой линейной алгебры в Джулии.

Вот как были определены переменные

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 return

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

As ожидается. Но

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

Я довольно новичок в Джулии. Почему это происходит?

1 Ответ

5 голосов
/ 13 февраля 2020

Это потому, что sqrt(2) - это число с плавающей запятой, такое, что (sqrt(2)*sqrt(2)) НЕ равно 2.

Один из способов решения этой проблемы - определить новый тип для чисел Алгебраи c, как вы можете видеть в AlgebracNumbers.jl .

Пример:

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