This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | Next revision Both sides next revision | ||
bash_functions [2014/08/05 18:49] k2patel [Print lines on screen descending from the current point] |
bash_functions [2014/09/29 01:25] k2patel [Integer or Decimal] |
||
---|---|---|---|
Line 225: | Line 225: | ||
[[ https://www.linkedin.com/groups/How-can-i-verify-if-3716796.S.5862974732210556931?view=&item=5862974732210556931&type=member&gid=3716796&trk=eml-b2_anet_digest-null-2-null&fromEmail=fromEmail&ut=3KLlfwU1D4UCk1 | From Article ]] | [[ https://www.linkedin.com/groups/How-can-i-verify-if-3716796.S.5862974732210556931?view=&item=5862974732210556931&type=member&gid=3716796&trk=eml-b2_anet_digest-null-2-null&fromEmail=fromEmail&ut=3KLlfwU1D4UCk1 | From Article ]] | ||
+ | |||
+ | ==== floating point multiplication ==== | ||
+ | <code bash> | ||
+ | fpmul() #@ Perform floating-point multiplication in the shell | ||
+ | { #@ USAGE: fpmul [VAR] NUM.DEC ... | ||
+ | local _var= _places _tot _neg _n _int _dec _df _fpmul | ||
+ | if [[ ${1^^} =~ ^[A-Z_][A-Z0-9_]*$ ]] | ||
+ | then | ||
+ | _var=$1 | ||
+ | shift | ||
+ | fi | ||
+ | _places= | ||
+ | _tot=1 | ||
+ | _neg= | ||
+ | for _n | ||
+ | do | ||
+ | ## 2 negatives make a positive | ||
+ | case $_n in | ||
+ | -*) [ "$_neg" = '-' ] && _neg= || _neg='-' | ||
+ | _n=${_n#-} | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | ## Check for non-numeric characters | ||
+ | case $_n in | ||
+ | *[!0-9.]*) return 1 ;; | ||
+ | esac | ||
+ | |||
+ | ## count the number of decimal _places, | ||
+ | ## then remove the decimal point | ||
+ | case $_n in | ||
+ | .*) _int= | ||
+ | _dec=${_n#?} | ||
+ | _places=$_places$_dec | ||
+ | _n=$_dec | ||
+ | ;; | ||
+ | *.*) _dec=${_n#*.} | ||
+ | _int=${_n%.*} | ||
+ | _places=$_places$_dec | ||
+ | _n=$_int$_dec | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | ## remove leading zeroes | ||
+ | while : | ||
+ | do | ||
+ | case $_n in | ||
+ | ""|0) _n=0 | ||
+ | _fpmul=0 | ||
+ | return | ||
+ | ;; | ||
+ | 0*) _n=${_n#0} ;; | ||
+ | *) break;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | ## multiply by the previous _total | ||
+ | _tot=$(( $_tot * ${_n:-0} )) | ||
+ | |||
+ | ## report any overflow error | ||
+ | case $_tot in | ||
+ | -*) printf "fpmul: overflow error: %s\n" "$_tot" >&2 | ||
+ | return 1 | ||
+ | ;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | while [ ${#_tot} -lt ${#_places} ] | ||
+ | do | ||
+ | _tot=0$_tot | ||
+ | done | ||
+ | |||
+ | _df= | ||
+ | while [ ${#_df} -lt ${#_places} ] | ||
+ | do | ||
+ | left=${_tot%?} | ||
+ | _df=${_tot#$left}$_df | ||
+ | _tot=$left | ||
+ | done | ||
+ | _fpmul=$_tot${_df:+.$_df} | ||
+ | |||
+ | ## remove trailing zeroes or decimal points | ||
+ | while : | ||
+ | do | ||
+ | case $_fpmul in | ||
+ | *.*[0\ ]|*.) _fpmul=${_fpmul%?} ;; | ||
+ | .*) _fpmul=0$_fpmul ;; | ||
+ | *) break ;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | [[ $_var ]] && | ||
+ | printf -v "$_var" %s "$_fpmul" || | ||
+ | printf '%s\n' "$_fpmul" | ||
+ | } | ||
+ | num.dec | ||
+ | </code> | ||
+ | |||
+ | [[http://www.linkedin.com/groups/Fridays-function-fpmul-Perform-floatingpoint-3716796.S.5921339472191987716?view=&item=5921339472191987716&type=member&gid=3716796&trk=eml-b2_anet_digest-hero-1-hero-disc-disc-0&midToken=AQG8JYIVdmXjvA&fromEmail=fromEmail&ut=3_RJ7vAOch56s1|From article]] |