[julia-users] Re: Does rationalize ever round to zero?

2016-05-11 Thread James Fairbanks
Jeffrey Sarnoff
 writes:

> You can post it as an issue.

For further discussion: https://github.com/JuliaLang/julia/issues/16311



[julia-users] Re: Does rationalize ever round to zero?

2016-05-10 Thread Jeffrey Sarnoff
You can post it as an issue.

On Tuesday, May 10, 2016 at 4:21:18 PM UTC-4, Jeffrey Sarnoff wrote:
>
> This appears to be a bug.  The docs for rationalize 
>  say 
> rationalize([*Type=Int*, ]*x; tol=eps(x)*) Approximate floating point 
> number x as a Rational number with components of the given integer type. 
> The result will differ from x by no more than tol.
>
> meanwhile, here is a "long way around" that may do what you want 
> (signature and special cases are cribbed from rational.jl)
>
> function rationalized{T<:Integer}(::Type{T}, x::AbstractFloat; 
> tol::Real=eps(x))
> tol < 0 && throw(ArgumentError("negative tolerance'))
> isnan(x) && return zero(T)//zero(T)
> isinf(x) && return (x < 0 ? -one(T) : one(T)) // zero(T)
> rationalize(round(x, floor(Int,abs(log2(tol)
> end
>
>
> On Thursday, May 5, 2016 at 11:13:45 AM UTC-4, James Fairbanks wrote:
>>
>> Hello julia-users,
>>
>> Does rationalize ever return 0//1 for nonzero inputs?
>>
>> 0.0+eps(Float64) is much closer to 0//1 than to 1//1.
>> Why can't I get 0//1 out of rationalize(x) if x != 0.0?
>> Is this to avoid divide by 0 errors when using a/rationalize(x) where 0 < 
>> x < tol?
>>
>> For example on julia v0.4.5 
>> julia> rationalize(0.0)
>> 0//1
>>
>> julia> rationalize(0.0+eps(Float64))
>> 1//4503599627370496
>>
>> julia> rationalize(0.0+eps(Float64);tol=1e-4)
>> 1//1
>>
>> julia> rationalize(0.0+eps(Float64);tol=1e-4)
>> 1//1
>>
>> Thanks,
>> James
>>
>

[julia-users] Re: Does rationalize ever round to zero?

2016-05-10 Thread Jeffrey Sarnoff
This appears to be a bug.  The docs for rationalize 
 say 
rationalize([*Type=Int*, ]*x; tol=eps(x)*) Approximate floating point number
 x as a Rational number with components of the given integer type. The 
result will differ from x by no more than tol.

meanwhile, here is a "long way around" that may do what you want (signature 
and special cases are cribbed from rational.jl)

function rationalized{T<:Integer}(::Type{T}, x::AbstractFloat; 
tol::Real=eps(x))
tol < 0 && throw(ArgumentError("negative tolerance'))
isnan(x) && return zero(T)//zero(T)
isinf(x) && return (x < 0 ? -one(T) : one(T)) // zero(T)
rationalize(round(x, floor(Int,abs(log2(tol)
end


On Thursday, May 5, 2016 at 11:13:45 AM UTC-4, James Fairbanks wrote:
>
> Hello julia-users,
>
> Does rationalize ever return 0//1 for nonzero inputs?
>
> 0.0+eps(Float64) is much closer to 0//1 than to 1//1.
> Why can't I get 0//1 out of rationalize(x) if x != 0.0?
> Is this to avoid divide by 0 errors when using a/rationalize(x) where 0 < 
> x < tol?
>
> For example on julia v0.4.5 
> julia> rationalize(0.0)
> 0//1
>
> julia> rationalize(0.0+eps(Float64))
> 1//4503599627370496
>
> julia> rationalize(0.0+eps(Float64);tol=1e-4)
> 1//1
>
> julia> rationalize(0.0+eps(Float64);tol=1e-4)
> 1//1
>
> Thanks,
> James
>