From: Mike Cargal Date: 2010-11-08T01:33:14+09:00 Subject: Re: Create a class - ideas On Nov 7, 2010, at 12:20 AM, flebber wrote: > On Nov 7, 12:13 pm, flebber wrote: >> On Nov 7, 11:06 am, Mike Cargal wrote: >> >> >> >> >> >>> On Nov 6, 2010, at 7:00 PM, flebber wrote: >> >>>> On Nov 7, 9:45 am, flebber wrote: >>>>> On Nov 7, 2:24 am, Robert Klemme wrote: >> >>>>>> On 06.11.2010 10:19, flebber wrote: >> >>>>>>> I am trying to create a class. I am struggling to figure the best flow >>>>>>> to get the maths side to work. >> >>>>>>> So say that >> >>>>>>> R is a float given by user input >>>>>>> P is a Total amount(Pool) >>>>>>> Per is a variable % >>>>>>> X is a variable that is a percentage of P defined by a maximum >>>>>>> allocation. >> >>>>>>> So main = (( R * X)/P)*100 >> >>>>>> First of all you should get your variables right. Variable "Per" does >>>>>> not show up in the formula and "main" is not mentioned in the list. >> >>>>>> The meaning of the formula is totally unclear to me. From what you gave >>>>>> you are calculating the fraction (R/P) multiply it with 100 (so you >>>>>> actually get (R/P) percent and now you multiply with another percentage >>>>>> (X). So you have a percentage of a percentage. >> >>>>>>> What I want to test is the value of X needed to equal Per from X's >>>>>>> maximum allocation down. >> >>>>>> Can you write down a formula that contains all variables in your list >>>>>> and point at the fixed ones (constants), user inputs and variables you >>>>>> want to resolve? >> >>>>>>> What i am thinking but cant get right >> >>>>>>> Say >> >>>>>>> R = 5 >>>>>>> P = 10 >>>>>>> Per = 190 >>>>>>> X = max 80% of P >> >>>>>>> For X in main = Per ( Closest whole number or half that equals closest >>>>>>> to but greater than Per) >>>>>>> main = (( 5 * 8)/10)*100 >> >>>>>>> So in example intially main equalled 400%. And answer I would want to >>>>>>> resolve it to is X = 4 which is 200% as 3.50 equals 180%. >> >>>>>>> Any ideas? >> >>>>>> Sorry you lost me somewhere along the path. Also it's tea time right now... >> >>>>>> Cheers >> >>>>>> robert >> >>>>>> -- >>>>>> remember.guy do |as, often| as.you_can - without endhttp://blog.rubybestpractices.com/ >> >>>>> So I want to check by changing X when in forumla "main" that it is => >>>>> than "per" >> >>>>> In simple terms I want to calculate units needed to reach a rate of >>>>> return, X represents the variable units and per is the ROI(return of >>>>> investment rate I would deaire to acheive), R is the ratio of return >>>>> and P is a pool or base amount, I am using base 10 to start off with. >> >>>>> I am trying to test X for a value, the only constraint on X is that it >>>>> cannot exceed 80% of the P or Pool amount. >>>>> So if I set per = 190% >> >>>>> R = 5 >>>>> P = 10 >>>>> Per = 190 >>>>> X = max 80% of P >> >>>>> For X in main >= per >> >>>>> main = (( 5 * X)/10)*100 >= 190% >> >>>>> so for X = 80% of P or 8 base units >> >>>>> main = (( 5 * 8)/10)*100 >> >>>>> which would test out as >> >>>>> main >= per >> >>>>> 400 => 190 - >> >>>>> So when X is 8 units the main section is greater than per but its not >>>>> the closest whole unit to per. >> >>>>> So when X = 40% or 4 base units >> >>>>> main = (( 5 * 4)/10)*100 >>>>> main >= per >>>>> 200 >= 190 >> >>>>> this is the largest unit in 0.5 increments that remains greater than >>>>> Per of 190 so I would want X once tested to resolve to this. >> >>>>> I hope that made sense. >> >>>> So how do I best get X to run a loop in 0.5 increments until it >>>> reaches the closest value that makes the left side of an equation >>>> greater or equal to the right. But where it is the lowest value that >>>> is greater than or equal to the the right. >> >>>> Main => Per - where main is the lowest value it can be greater than >>>> per. >> >>>> Cheers >> >>>> Sayth >> >>> Something's not right with your formulas (I suspect) >> >>>>>>> main = (( R * X)/P)*100 >> >>> and X = X*P >> >>> so... main = >>> R*(X*P) >>> ----------- * 100 >>> P >> >>> the P's cancel out... >>> R*X*100 >> >>> varying P will not change the results of your calculations... >> >>> here's what I believe that you're asking for... >>> ================================ >>> r = 5.0 >>> p = 10.0 >>> per = 190.0 >>> x = 0.8 >> >>> begin >>> main = ((r*(x*p))/p)*100 >>> lastSuccess = x if main >= per >>> x -= 0.05 >>> end while main >= per >>> puts "#{lastSuccess*100.0}%" >>> =============================== >>> note: you can change p al day long and always get the same answer >> >>> there are probably more "rubified" ways to express this. >>> I've tried to maintain the approach you've stated. However, I would simplify the equation first, and since the last X that succeeds as you decrement is the same thing as the first that succeeds as you're going up, I'd probably turn t into something like... >>> =============================== >>> r = 5.0 >>> p = 10.0 >>> per = 190.0 >>> max_x = 0.8 >> >>> x = 0.05 >>> const = r*100 # simplified without X >>> x += 0.05 while (x*const < per) && (x <= max_x) >>> puts x <= max_x ? "#{lastSuccess*100.0}%" : "no answer" >>> =============================== >> >>> Mike Cargal >> >>> m...@cargal.nethttp://blog.mikecargal.com >> >> Thanks for looking at this for me. >> >>> You've really lost me when 80% turns into 8 (or 8 base units). What is a base unit? And why would it be equal to 10%? >>> Are you looking to vary X from 80% down by 5% increments? >> >> This test is the first of 4 I plan to make into one program. For each >> their while be a maximum allocation so in this case 80% so may be 40% >> etc. The pool in future will vary but I am using base 10 while I write >> it(hoping it would be clearer for another person reading it). So that >> means that X has a max allocation of units if 40% was the maximum >> allocation and base 10 then X would be 4 units and I would want my >> loop to test X from 0 to 4 in 0.5 increments. >> >> I am going to need more time to read your solution as I haven't got it >> first read. I had started to look athttp://www.rubyist.net/~slagell/ruby/iterators.html >> >> and a solution flow similar to >> >> ruby> def WHILE(cond) >> | return if not cond >> | yield >> | retry >> | end >> nil >> ruby> i=0; WHILE(i<3) { print i; i+=1 } >> 012 nil- Hide quoted text - >> >> - Show quoted text - > > Actually after re-reading your post I get it. All but one small bit. > > In your formula how does the ? "#{lastSuccess*100.0}%" bit work? what > data does lastSuccess pull. > > x = 0.05 > const = r*100 # simplified without X > x += 0.05 while (x*const < per) && (x <= max_x) > puts x <= max_x ? "#{lastSuccess*100.0}%" : "no answer" > my bad... r = 5.0 p = 10.0 per = 190.0 max_x = 0.8 x = 0.05 const = r*100 # simplified without X x += 0.05 while (x*const < per) && (x <= max_x) puts x <= max_x ? "#{x*100.0}%" : "no answer" Mike Cargal mike@cargal.net http://blog.mikecargal.com