Как упоминалось в комментариях, наилучшим способом является использование типа Rational. E.x., A = Rational{Int}[1 2;3 4]
, чтобы получить выход в нужном формате, A*float(inv(A))
. Кредиты для @mschauer.
Чтобы разработать немного, числа с плавающей точкой, обычно используемые при вычислении, имеют ограниченную точность и не могут представлять все действительные числа. Следовательно, вы получаете такие ошибки при работе с числами с плавающей запятой. См. Ссылки в комментариях для получения подробной информации по этой проблеме.
Julia однако очень легко определить другие числовые типы и работать с ними, если хотите. Один из них - тип рационального числа, который может точно представлять дроби. Мы можем создать массив как рациональные числа:
julia> A = Rational{Int}[1 2;3 4] 2x2 Array{Rational{Int64},2}: 1//1 2//1 3//1 4//1
Затем, операции на этом массиве будут возвращать точный рациональные результаты
julia> A*(inv(A)) 2x2 Array{Rational{Int64},2}: 1//1 0//1 0//1 1//1
Если мы хотим, чтобы результаты в виде чисел с плавающей точкой, они могут быть преобразованный в конце вычисления.
julia> float(A*(inv(A))) 2x2 Array{Float64,2}: 1.0 0.0 0.0 1.0
Важно отметить, что причина чисел с плавающей запятой используются по умолчанию является производительность. ЦП оптимизированы для работы с числами с плавающей запятой, и использование рациональных методов, как указано выше, будет намного медленнее. Джулия, однако, предоставляет вам инструменты, позволяющие вам сделать этот выбор самостоятельно, исходя из ваших собственных потребностей.
Вот как работают номера с плавающей запятой. 64 бита удвоения IEEE дают 16 цифр точности. https://en.wikipedia.org/wiki/IEEE_floating_point – duffymo
Добро пожаловать в мир вычислений с плавающей запятой. Это нормально. Вы можете реализовать свои собственные матричные операции с десятичным символом, но есть причина, почему числа с плавающей запятой доминируют в научном мире. – sascha
Вы можете использовать 'SymPy', если вы хотите использовать символическую математику в' Julia': ' использование SymPy; A = [Sym (1) 2; 3 4]; A * inv (A) '. (Это просто передает задачу в модуль Sympy Python.) – jverzani