0 is a special case because there is no "scale" by which to measure 
"closeness":

julia> eps(1.0)
2.220446049250313e-16                                                           
                                                                                
                                                                                
                               
                                                                                
                                                                                
                                                                                
                               
julia> eps(1e-10)
1.2924697071141057e-26                                                          
                                                                                
                                                                                
                               
                                                                                
                                                                                
                                                                                
                               
julia> eps(1e-100)
1.2689709186578246e-116                                                         
                                                                                
                                                                                
                               

--Tim                                                                           
                                                                                
                                                                                
                                    

On Sunday, September 06, 2015 06:39:06 PM Diego Javier Zea wrote:
> 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,

Reply via email to