@@ -261,7 +261,8 @@ function _compute_estimate(
261261    #  https://github.com/JuliaLang/julia/issues/39151.
262262    # 
263263    #  We strip units because the estimate coefficients are just weights for values of f.
264-     _coefs =  ustrip .(T .(coefs))
264+     N =  numType (T)
265+     _coefs =  N .(coefs)
265266    return  sum (fs .*  _coefs) ./  T (step) ^  Q
266267end 
267268
@@ -358,27 +359,26 @@ estimate of the derivative.
358359function  estimate_step (
359360    m:: UnadaptedFiniteDifferenceMethod , f:: TF , x:: T ,
360361) where  {TF,T<: Number }
361-     step, acc =  withUnit .( 
362-          unit (x), 
363-          _compute_step_acc_default (m, x )
364-     )
362+     step, acc =  _compute_step_acc_default (m, x) 
363+     xunit  =   unit (x)
364+     step  =   withUnit (xunit, step )
365+     acc  =   withUnit (xunit,acc )
365366    return  _limit_step (m, x, step, acc)
366367end 
367368function  estimate_step (
368369    m:: AdaptedFiniteDifferenceMethod{P,Q} , f:: TF , x:: T ,
369370) where  {P,Q,TF,T<: Number }
370371    ∇f_magnitude, f_magnitude =  _estimate_magnitudes (m. bound_estimator, f, x)
371-     step, acc =  withUnit .(
372-         (
373-             unit (x),
374-             unit (first (f (x))) /  unit (x) ^  Q
375-         ),
372+     xunit =  unit (x)
373+     dfunit =  unit (first (f (x))) /  unit (x) ^  Q
374+     step, acc = 
376375        if  ∇f_magnitude ==  withUnit (unit (∇f_magnitude),0.0 ) ||  f_magnitude ==  withUnit (unit (f_magnitude), 0.0 )
377376            _compute_step_acc_default (m, x)
378377        else 
379378            _compute_step_acc (m, ∇f_magnitude, eps (f_magnitude))
380379        end 
381-     )
380+     step =  withUnit (xunit, step)
381+     acc =  withUnit (dfunit, acc)
382382    return  _limit_step (m, x, step, acc)
383383end 
384384
@@ -431,10 +431,8 @@ function _limit_step(
431431    end 
432432    #  Second, prevent very large step sizes, which can occur for high-order methods or
433433    #  slowly-varying functions.
434-     step_default, _ =  withUnit .(
435-         xunit,
436-         _compute_step_acc_default (m, x)
437-     )
434+     step_default, _ =  _compute_step_acc_default (m, x)
435+     step_default =  withUnit (xunit, step_default)
438436    step_max_default =  1000 step_default
439437    if  step >  step_max_default
440438        step =  step_max_default
@@ -628,3 +626,22 @@ function withUnit(targetUnit, value)
628626    end  #  if
629627
630628end  #  function
629+ 
630+ """ 
631+ Retrieves the number type of a quantity, or returns the type itself in the case of a raw number. 
632+ """ 
633+ function  numType (x:: Number )
634+     typeof (x)
635+ end  #  function
636+ 
637+ function  numType (x:: Type{<:Number} )
638+     x
639+ end 
640+ 
641+ function  numType (x:: Unitful.AbstractQuantity )
642+     Unitful. numtype (typeof (x))
643+ end  #  function
644+ 
645+ function  numType (x:: Type{<:Unitful.AbstractQuantity} )
646+     Unitful. numtype (x)
647+ end 
0 commit comments