Matrix Julia矩阵乘法逆舍入误差

Matrix Julia矩阵乘法逆舍入误差,matrix,precision,julia,matrix-multiplication,matrix-inverse,Matrix,Precision,Julia,Matrix Multiplication,Matrix Inverse,为什么结果显示在左下角8.88178e-16,而不是右上角的0.0?如何执行该操作以获得结果[1.0 0.0;0.0 1.0] 有没有一种方法可以根据需要显示结果,但实际上可以像在muPad或其他符号计算器中那样以符号方式执行矩阵运算?如注释中所述,最好的方法是使用Rational type。E.x.,A=Rational{Int}[12;34],要获得所需格式的输出,请使用A*float(inv(A))。归功于@mschauer 更详细地说,计算中通常使用的浮点数精度有限,不能代表所有实数。因

为什么结果显示在左下角
8.88178e-16
,而不是右上角的
0.0
?如何执行该操作以获得结果
[1.0 0.0;0.0 1.0]


有没有一种方法可以根据需要显示结果,但实际上可以像在muPad或其他符号计算器中那样以符号方式执行矩阵运算?

如注释中所述,最好的方法是使用Rational type。E.x.,
A=Rational{Int}[12;34]
,要获得所需格式的输出,请使用
A*float(inv(A))
。归功于@mschauer

更详细地说,计算中通常使用的浮点数精度有限,不能代表所有实数。因此,在使用浮点数进行操作时会出现此类错误。有关此问题的详细信息,请参阅评论中的链接

然而,Julia使定义其他数值类型变得非常容易,如果需要,还可以对它们进行操作。其中之一是有理数类型,它可以精确地表示分数。我们可以将数组创建为有理数:

julia>A=Rational{Int}[12;34]
2x2数组{Rational{Int64},2}:
1//1  2//1
3//14//1

然后,此数组上的操作将返回精确的rational结果

julia>A*(inv(A))
2x2数组{Rational{Int64},2}:
1//1  0//1
0//1//1

如果我们希望结果是浮点数,可以在计算结束时转换它们

julia>float(A*(inv(A)))
2x2数组{Float64,2}:
1.0  0.0
0.01.0


需要注意的是,默认情况下使用浮点数的原因是性能。CPU经过优化,可以在浮点数上运行,使用上面提到的有理数将会慢得多。然而,朱莉娅给了你工具,让你自己根据自己的需要做出选择

这就是浮点数的工作原理。IEEE双精度64位给出16位精度。欢迎来到浮点计算的世界。这种行为是正常的。您可以使用类似十进制的数字对象实现自己的矩阵运算,但有一个原因,那就是为什么浮点数在科学界占主导地位如果您想在
Julia
中使用符号数学,您可以使用
symphy
使用symphy;A=[Sym(1)2;34];A*inv(A)
。(这只是将任务传递给Python的Symphy模块。)@jverzani的可能副本:或者,Arthur可以使用原生Rational类型:
A=Rational[12;34];A*inv(A)
julia> A = [1 2; 3 4]
2x2 Array{Int64,2}:
 1  2
 3  4

julia> A * inv(A)
2x2 Array{Float64,2}:
 1.0          0.0
 8.88178e-16  1.0