On 16/12/11 16:05, Alexandre Torres Porres wrote:
looks like a job for an external
Not really answering the OP question but something could be done in Python:
def find_frac(num): f = float(num) last_error = 1000 best = (0,0) for i in xrange(1,1001): for j in xrange(1,i+1): divide = (float(i) / float (j)) if divide == f: return ((i,j),0) err = abs(divide - f) if err < last_error: best = (i,j) last_error = err return (best,last_error)
This would try to find the exact fraction or the one with the smallest error (trying up to 1000/1000). It would return (numerator, denominator, error). Guess it would work well at least up to 100 but only for positive numbers... and... not for numbers < 1.. and surely it's not optimised etc. etc. :)
find_frac(2)
((2, 1), 0)
find_frac(1.5)
((3, 2), 0)
find_frac(1.333333333333333333333333333)
((4, 3), 0)
find_frac(2.4)
((12, 5), 0)
find_frac(2.8)
((14, 5), 0)
find_frac(2.987654321)
((242, 81), 1.234568003383174e-11)
find_frac(50.32)
((956, 19), 0.004210526315787888)
find_frac(50.322)
((956, 19), 0.006210526315790332)
find_frac(50.4)
((252, 5), 0)
find_frac(10.33)
((971, 94), 0.00021276595744623705)
find_frac(10.33333333333333333333333333)
((31, 3), 0)
Lorenzo.
2011/12/16 i go bananas <hard.off@gmail.com mailto:hard.off@gmail.com>
actually, i'm not going to do anything more on this. i had a look at the articles claude posted, and they went a bit far over my head. my patch will still work for basic things like 1/4 and 7/8, but i wouldn't depend on it working for a serious application. As you first suggested, it's not so simple, and if you read claude's articles, you will see that it isn't. it's not brain science though, so maybe someone with a bit more number understanding can tackle it. On Sat, Dec 17, 2011 at 12:51 AM, Alexandre Torres Porres <porres@gmail.com <mailto:porres@gmail.com>> wrote: > i had a go at it thanks, I kinda had to go too, but no time... :( > yeah, my patch only works for rational numbers. you know what, I think I asked this before on this list, deja'vu > will have a look at the article / method you posted, claude. are you going at it too? :) by the way, I meant something like 1.75 becomes 7/4 and not 3/4, but that is easy to adapt on your patch thanks cheers 2011/12/16 i go bananas <hard.off@gmail.com <mailto:hard.off@gmail.com>> by the way, here is the method i used: first, convert the decimal part to a fraction in the form of n/100000 next, find the highest common factor of n and 100000 (using the 'division method' like this: http://easycalculation.com/what-is-hcf.php ) then just divide n and 100000 by that factor. actually, that means it's accurate to 6 decimal places, i guess. well...whatever :D
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list