As an example: using JuliaGeometry/Quaternion.jl and initializing a 
Quaternion with FlexFloats instead of Float64s.  I have all of the 
mathematical support necessary to handle every operation that the 
Quaternion package uses where the Quaternion elements are FlexFloats.  The 
type there is:

```julia
immutable Quaternion{T<:Real} <: Number s::T v1::T v2::T v3::T norm::Bool 
end 
``` Without changing to my abstract hierarchy, any conversion function 
tried responds "ERROR: TypeError: Quaternion: in T, expected T<:Real, got 
Type{FlexibleFloat.FlexFloat{_,_}}." Altering my type to be ```julia 
immutable FlexFloat{T<:WorkFlex, F<:WorkFloat} <: Real lo::F hi::F end ``` 
Does not help; it wants my 'F' to be <: Real (or something like that). My 
'F' is Union{Float64, Float32} (now) -- reasonably <: Real, but it does noe 
convert. There are many good packages that use a similar setup, type T{..} 
<: Real, or type T{..} <: Number. I am looking for the generalized 
perspective and associated way of coding that lets such 
conversions/promotions just work. 


On Tuesday, December 1, 2015 at 1:05:27 PM UTC-5, Tom Breloff wrote:
>
> I think I'm slightly confused on your end goal. Can you maybe give a 
> concrete example of the types involved and the operation, and tell us 1) 
> what type you want the result to be, and 2) why simple conversions won't do 
> the trick. 
>
> If you can do "f(convert(T1, x1), convert(T2, x2))" for some method f, 
> types T1/2, and values x1/2 and get your result, then I expect the 
> promotion system will work fine. 
>
> On Tuesday, December 1, 2015, Jeffrey Sarnoff <[email protected] 
> <javascript:>> wrote:
>
>> There may be some way to leverage the promotion system for this purpose.  
>> I do not know how to do that.
>>
>> On Tuesday, December 1, 2015 at 12:30:57 PM UTC-5, Jeffrey Sarnoff wrote:
>>>
>>> Yes -- it rocks.  Promotion+conversion needs to know detailed stuff 
>>> about the destination type (unsurprisingly).  I'm hoping for a [partial] 
>>> meta- or supra- way that would simplify work for me and for other people 
>>> who may want this as another way to use their own packaged number stuff.  
>>> Is there an avenue that [partially] obviates the need to deeply code each 
>>> package's preparation?  
>>>
>>> On Tuesday, December 1, 2015 at 12:01:27 PM UTC-5, Tom Breloff wrote:
>>>>
>>>> Have you tried Julia's promotion mechanism?  This has worked well for 
>>>> me in the past, although there may be a slight performance penalty... I 
>>>> can't comment on that.
>>>>
>>>>
>>>> http://docs.julialang.org/en/release-0.4/manual/conversion-and-promotion/#promotion
>>>>
>>>> On Tue, Dec 1, 2015 at 11:54 AM, Jeffrey Sarnoff <[email protected]> 
>>>> wrote:
>>>>
>>>>> I am working on a module that uses bounded intervals.  It would be 
>>>>> great if the result were easy to use with other's packaged floating-point 
>>>>> based or Real derived types.
>>>>> They work like stretchy Float64s, and support arith, exp, log, 
>>>>> [a]trig[h], and cdf+pdf+quantile for univariate continuous distributions.
>>>>>
>>>>>
>>>>> Is there any type hierarchy modification with some generalized code 
>>>>> that would make "conversion to __ not found" happen less when using
>>>>> this as if it were Float64 with others' floating point based types 
>>>>> that are not dependant on sizeof()?
>>>>>
>>>>> ```julia
>>>>>
>>>>> abstract EnhancedFloat <: Real abstract AnyFlexFloat <: EnhancedFloat 
>>>>> #  FlexFloat is a (lo,hi) bounded interval # either or both bounds 
>>>>> may be Closed(Cl) or Open(Op) # e.g. ClOp(lo,hi) is a ClOpen interval.
>>>>>  
>>>>> abstract OpOp <: AnyFlexFloat abstract ClOp <: AnyFlexFloat abstract 
>>>>> OpCl <: AnyFlexFloat abstract ClCl <: AnyFlexFloat typealias WorkFlex 
>>>>> AnyFlexFloat; # was Union{ClCl,ClOp,OpCl,OpOp} typealias WorkFloat 
>>>>> Union{Float64,Float32}; immutable FlexFloat{T<:WorkFlex, F<:WorkFloat} # 
>>>>> <: 
>>>>> Real does not seem to help much lo::F hi::F end ``` 
>>>>>
>>>>
>>>>

Reply via email to