Thanks Tim! But I don't fully understand it, because I believed that*
isapprox()* should be *true*, but gives me *false* in this case. My
particular function with the problem use the *std()* output in the next
way. Is this correct? I'm using *isapprox* and
* !isapprox*
function calculatezscore{T,N}(value::AbstractArray{T,N}, average::
AbstractArray{T,N}, sd::AbstractArray{T,N})
zscore = similar(value)
if size(value) == size(average) == size(sd)
for i in eachindex(zscore)
val = value[i]
ave = average[i]
sta = sd[i]
if val ≈ ave
zscore[i] = 0.0
elseif sta ≉ 0.0
zscore[i] = (val - ave)/sta
else
zscore[i] = NaN
end
end
else
throw(ErrorException("The elements should have the same size"))
end
zscore
end
Are there other ways to manage the reality of the float arithmetic?
El domingo, 6 de septiembre de 2015, 22:27:23 (UTC-3), Tim Holy escribió:
>
> 1e-17 is indistinguishable from mathematical zero if it's based on
> differences
> among numbers that are O(1).
>
> julia> a = fill(total, 100);
>
> julia> sum(a)/100 == total
> false
>
> julia> sum(a)/100 - total
> -1.3877787807814457e-17
>
> But this is off by only one ulp:
>
> julia> nextfloat(sum(a)/100) == total
> true
>
> So my advice is that you should write your algorithms in a manner that
> takes
> the realities of floating-point arithmetic into account.
>
> --Tim
>
> On Sunday, September 06, 2015 05:19:36 PM Diego Javier Zea wrote:
> > The returned value from std should be zero if all the values are equal
> > (since the distance between the mean and the values should be zero).
> > However, the returned value isn't zero:
> >
> > julia> total
> > 0.11008615848501174
> >
> > julia> mean(Float64[total for i in 1:100])
> > 0.11008615848501173
> >
> > julia> std(Float64[total for i in 1:100])
> > 1.3947701538996772e-17
> >
> > julia> std(Float64[total for i in 1:100]) ≈ zero(Float64)
> > false
> >
> > julia> mean(Float64[total for i in 1:100]) ≈ total
> > true
> >
> >
> > How can I get a more precise result from *std()*?
> >
> > Best,
>
>