Julia 平均函数不正确值

Julia 平均函数不正确值,julia,mean,Julia,Mean,我有一个80个元素的数组,具有相同的条目:176.01977965813853 如果我使用均值函数,我将得到值176.01977965813842 为什么呢 下面是一个简单的工作示例: using Statistics arr = fill(176.01977965813853, 80) julia> mean(arr) 176.01977965813842 我希望它返回176.01977965813853。这些只是预期的浮点错误。但是,如果您需要非常精确的求和,您可以使用更精细、更昂

我有一个80个元素的数组,具有相同的条目:176.01977965813853

如果我使用均值函数,我将得到值176.01977965813842

为什么呢

下面是一个简单的工作示例:

using Statistics
arr = fill(176.01977965813853, 80)

julia> mean(arr)
176.01977965813842

我希望它返回176.01977965813853。

这些只是预期的浮点错误。但是,如果您需要非常精确的求和,您可以使用更精细、更昂贵的求和方案:

julia> using KahanSummation
[ Info: Precompiling KahanSummation [8e2b3108-d4c1-50be-a7a2-16352aec75c3]

julia> sum_kbn(fill(176.01977965813853, 80))/80
176.01977965813853

参考:

这些只是预期的浮点错误。但是,如果您需要非常精确的求和,您可以使用更精细、更昂贵的求和方案:

julia> using KahanSummation
[ Info: Precompiling KahanSummation [8e2b3108-d4c1-50be-a7a2-16352aec75c3]

julia> sum_kbn(fill(176.01977965813853, 80))/80
176.01977965813853

参考:

据我所知,问题可以按如下方式重现:

using Statistics
arr = fill(176.01977965813853, 80)

julia> mean(arr)
176.01977965813842
原因是julia在默认情况下使用64位精度执行所有浮点运算,即Float64类型。float64不能表示任何实数。每个浮点数之间有一个有限的步长,在对它们进行算术运算时会产生舍入错误。这些舍入误差通常很好,但如果你不小心,它们可能是灾难性的。例如:

julia> 1e100 + 1.0 - 1e100
0.0
也就是说,如果我做10^100+1-10^100,我得到零!如果您想获得浮点运算引起的错误的上限,我们可以使用Interval算术.jl:

using IntervalArithmetic

julia> 1e100 + interval(1.0) - 1e100
[0, 1.94267e+84]
也就是说,操作1e100+1.0-1e100至少等于0.0,最多等于1.94*10^84,因此误差范围很大

我们可以为你感兴趣的手术做同样的事情

arr = fill(interval(176.01977965813853), 80);

julia> mean(arr)
[176.019, 176.02]

julia> mean(arr).lo
176.019779658138

julia> mean(arr).hi
176.0197796581391
也就是说,实际平均值可能至少为176.019779658138,或最多为176.0197796581391,但由于浮点错误,无法再确定!所以在这里,Float64给出的答案最多有10^-13%的误差,这实际上相当小

如果这些都是不可接受的错误界限呢?使用更精确!可以使用“大字符串”宏获取任意精度数的文字:

arr = fill(interval(big"176.01977965813853"), 80);

julia> mean(arr).lo
176.0197796581385299999999999999999999999999999999999999999999999999999999999546

julia> mean(arr).hi
176.019779658138530000000000000000000000000000000000000000000000000000000000043
该计算是使用256位精度完成的,但使用setprecision函数可以获得更高的精度:

setprecision(1000)
arr = fill(interval(big"176.01977965813853"), 80);

julia> mean(arr).lo
176.019779658138529999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999599

julia> mean(arr).hi
176.019779658138530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000579

请注意,与float64相比,任意精度算法的速度较慢,因此通常最好只使用任意精度算法来验证结果,以确保在所需精度范围内收敛到良好的结果

据我所知,这个问题可以复制如下:

using Statistics
arr = fill(176.01977965813853, 80)

julia> mean(arr)
176.01977965813842
原因是julia在默认情况下使用64位精度执行所有浮点运算,即Float64类型。float64不能表示任何实数。每个浮点数之间有一个有限的步长,在对它们进行算术运算时会产生舍入错误。这些舍入误差通常很好,但如果你不小心,它们可能是灾难性的。例如:

julia> 1e100 + 1.0 - 1e100
0.0
也就是说,如果我做10^100+1-10^100,我得到零!如果您想获得浮点运算引起的错误的上限,我们可以使用Interval算术.jl:

using IntervalArithmetic

julia> 1e100 + interval(1.0) - 1e100
[0, 1.94267e+84]
也就是说,操作1e100+1.0-1e100至少等于0.0,最多等于1.94*10^84,因此误差范围很大

我们可以为你感兴趣的手术做同样的事情

arr = fill(interval(176.01977965813853), 80);

julia> mean(arr)
[176.019, 176.02]

julia> mean(arr).lo
176.019779658138

julia> mean(arr).hi
176.0197796581391
也就是说,实际平均值可能至少为176.019779658138,或最多为176.0197796581391,但由于浮点错误,无法再确定!所以在这里,Float64给出的答案最多有10^-13%的误差,这实际上相当小

如果这些都是不可接受的错误界限呢?使用更精确!可以使用“大字符串”宏获取任意精度数的文字:

arr = fill(interval(big"176.01977965813853"), 80);

julia> mean(arr).lo
176.0197796581385299999999999999999999999999999999999999999999999999999999999546

julia> mean(arr).hi
176.019779658138530000000000000000000000000000000000000000000000000000000000043
该计算是使用256位精度完成的,但使用setprecision函数可以获得更高的精度:

setprecision(1000)
arr = fill(interval(big"176.01977965813853"), 80);

julia> mean(arr).lo
176.019779658138529999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999599

julia> mean(arr).hi
176.019779658138530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000579

请注意,与float64相比,任意精度算法的速度较慢,因此通常最好只使用任意精度算法来验证结果,以确保在所需精度范围内收敛到良好的结果

你不会说你是如何得到另一个值的。不管怎样,结果似乎与浮点精度一致。我认为问题是它包含一个相同的值80倍。但是是的,修正到数值精度。你不能说你是如何得到其他值的。不管怎样,结果似乎与浮点精度一致。我认为问题是它包含一个相同的值80倍。但是是的,修正到数值精度。