# adapted from tcl Stats 2011-05-22, arithmetic mean [RLE] # ::math::combined_market_rate -- # # Return the combined_market_rate by one,two, or more given rates # market rate defined as quantity per price # or 1 over (price per quantity) # # Arguments: # # args values are one, two, or more given rates # # Results: combined_market_rate # works for positive numbers, negative numbers, # and mixed positive & negative numbers. # arg of zero returns zero # arg of null returns zero # filter foreach drops irregular zero elements from argument proc ::math::combined_market_rate { args} { set sum 0. set N [ expr { [ llength $args ] } ] if { $N == 0 } { return 0 } if { $N == 1 || [ lindex $args 0 ] == 0 } { return 0 } set res {};set counter2 0; # filter foreach drops irregular zero elements foreach item $args {if {$item != 0 } {incr counter2 1; lappend res $item } } set counter 0 foreach val $res { set sum [ expr { $sum + 1./$val } ] incr counter 1 } set combined_market_rate1 [ expr { 1./(($sum*1.)/$counter2) } ] return $combined_market_rate1 } # various testcases on combined_market_rate # puts [::math::combined_market_rate 0.5524 0.4807 0.42918 0.47846 ] # answer 0.48131 " # puts [ ::math::combined_market_rate .1 .2 .3 .4 ] # answer 0.192 # ::math::combined_market_rate -.1 -.2 -.3 -.4 # answer -0.192, correct # operator math formula follows # check [/ 1. [/ [+ [/ 1. -.1] [/ 1. -.2] [/ 1. -0.3 ] [/ 1. -0.4] ] 4. ] ] # returns -0.192, correct # puts " [ ::math::combined_market_rate .1 ] " # :math::combined_market_rate -.1 -.2 .3 .4 # answer -0.4363636363636364 # operator math formula follows # set check [/ 1. [/ [+ [/ 1. -.1] [/ 1. -.2] [/ 1. 0.3 ] [/ 1. 0.4] ] 4. ] ] # check equals -0.4363636363636364 # puts " for (::math::combined_market_rates .1) # returns .1 " # ::math::combined_market_rate {} # null returns zero, correct. # ::math::combined_market_rate 0 # arg 0 returns zero, correct. # addition dated 24sep2018 # added filter foreach to remove zero's # irregular zeros, # test on zero's 0.1 0.0 0.0 0.2 0.3 0.4 # returns 0.192 , correct # test on zero's 0.1 0.0 0.0 0.2 0.3 0.4 # returns 0.192 , correct