;+ ;FUNCTION: ; thm_ui_usingexponent ; ;PURPOSE: ; ; Used to determine if any of a set of inputs will be put into exponential notation ; ;Inputs: ;The data struct is an input to format annotation ;data.exponent values: ;0: autoformat ;1: decimal ;2: scientific ;3: base^x ; ; ;Outputs: ;Determine format type: ;--------------------- ;The type of annotation to be returned is chosen below by setting the 'type' variable. ;0 - numerical format ;1 - sci-notation (also requires expsign=1 or -1) ;2 - e^x format ;3 - 10^x format ; ;Example: ; ; ; ;$LastChangedBy: pcruce $ ;$LastChangedDate: 2012-03-06 17:31:08 -0800 (Tue, 06 Mar 2012) $ ;$LastChangedRevision: 9973 $ ;$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/thmsoc/tags/tdas_8_00/idl/themis/thm_ui_new/utilities/thm_ui_usingexponent.pro $ ;- pro thm_ui_usingexponent,val,data,type=type,expsign=expsign compile_opt idl2,hidden lengthLimit=64 ;more decimal places than this is absurd neg=0 dec=0 precision = data.formatid-1 > 0 ;desired decimal precision if ~in_set('exponent',strlowcase(tag_names(data))) then $ data = create_struct(data,'exponent',0b) ;Auto-Format if data.exponent eq 0 then begin thm_ui_getlengthvars, val, dec, neg check_dround, val, neg, dec, precision ;Check large values against precision if abs(val) ge 1 or val eq 0 then begin if dec gt (precision+1) then begin if data.scaling eq 1 then type = 3 else begin type = 1 expsign = 1 endelse endif else type = 0 ;Check small values against precision endif else if val ne 0 then begin if ceil(abs(alog10(abs(val)))) gt (precision+1) then begin if data.scaling eq 1 then begin type = 3 endif else begin type = 1 expsign = -1 endelse endif else type = 0 endif else begin dprint, 'Uncertain auto-format' type = -1 return endelse ;Handle log scaling and integer type if data.scaling eq 2 then type = 2 ; if data.scaling eq 1 then type = 3 if data.formatid eq 0 then type = 0 ;Fix to double format endif else if data.exponent eq 1 then begin type = 0 ;Fix to exponential format endif else if data.exponent eq 2 then begin type = 1 if abs(val) ge 1 then begin expsign = 1 endif else if val eq 0 then expsign = 0 $ else expsign = -1 endif else if data.exponent eq 3 then type = 3 ;If double format will exceed length limit then switch to exponential if type eq 0 then begin if ((neg+dec) gt lengthLimit and data.formatid eq 0) $ or ((neg+1+(precision+1)) gt lengthLimit) $ then begin type = 1 if abs(val) ge 1 then begin expsign = 1 endif else if val eq 0 then expsign = 0 $ else expsign = -1 endif endif end