;;;;;;;;;;;;;;;;;;;;;;;;;
;;;   num_model.pro   ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;

;;;
;;;  Author: wd (Wolfgang.Dobler@kis.uni-freiburg.de)
;;;  Date:   11-Jun-2004
;;;
;;;  Description:
;;;   Like F90's epsilon(), huge() and tiny() functions
;;;   Only created one function to keep name space clean
;;;
;;;  Usage:
;;;   epsi = num_model(1.,/epsilon)
;;;
;;;  Keywords:
;;;   EPSILON -- return the smallest psitive number that makes a
;;;              difference when added to 1.
;;;    HUGE   -- reuturn the largest number
;;;    TINY   -- reuturn tha smallest positive number

function num_model, x, $
                    EPSILON=epsilon, HUGE=huge, TINY=tiny, $
                    HELP=help


if (keyword_set(help)) then extract_help, 'num_model'

default, epsilon, 0
default, huge   , 0
default, tiny   , 0

s = size(x)
type = s[s[0]+1]

case type of

  2: begin                      ; int
    epsi = 1
    hug  = 32767
    tiny = 1
  end

  3: begin                      ; long int
    epsi = 1L
    hug  = 2147483647
    tiny = 1L
  end

  4: begin                      ; real
    epsi = 1.1920929e-07
    hug  = 3.4028235e+38
    tiny = 1.1754944e-38
  end

  5: begin                      ; double precision
    epsi = 2.220446049250313d-016
    hug  = 1.7976931348623158d+308
    tiny = 2.225073858507201d-308
  end

  else: begin
    message, "Don't know how to treat type " + strtrim(type,2), /INFO
    return, !values.f_nan
  endelse

endcase

if (epsilon) then begin
  return, epsi
endif else if (huge) then begin
  return, hug
endif else if (tiny) then begin
  return, tiny
endif else begin
  message, "Need to specify one of the /EPSILON, /HUGE, /TINY switches"
endelse

print, 'Here'

end
; End of file epsilon.pro