Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import division
- from random import random
- from math import floor
- def fractionize(R, n, d):
- error = abs(n/d - R)
- return (n, d, error) # (numerator, denominator, absolute difference to R)
- def better(a, b):
- return a if a[2] < b[2] else b
- def approximate(R, n, m):
- best = (0, 1, R)
- for d in xrange(1, m+1):
- n1 = min(n, int(floor(R * d)))
- n2 = min(n, n1 + 1) # ceil(R*d)
- best = better(best, fractionize(R, n1, d))
- best = better(best, fractionize(R, n2, d))
- return best
- if __name__ == '__main__':
- def main():
- R = random()
- n = 30
- m = 100
- print R, approximate(R, n, m)
- main()
- best_x,best_y=(1,1)
- for x in 1...n:
- y=max(1,min(m,round(x/R)))
- #optional optimization (if you have a fast gcd)
- if gcd(x,y)>1:
- continue
- if abs(R-x/y)<abs(R-bestx/besty):
- best_x,best_y=(x,y)
- return (best_x,best_y)
- r: input number to search.
- n,m: the ranges.
- for (int i=1;i<=m;i++)
- {
- minVal = min(Search(i,1,n,r), minVal);
- }
- //x and y are start and end of array:
- decimal Search(i,x,y,r)
- {
- if (i/x > r)
- return i/x - r;
- decimal middle1 = i/Cill((x+y)/2);
- decimal middle2 = i/Roof((x+y)/2);
- decimal dist = min(middle1,middle2)
- decimal searchResult = 100000;
- if( middle > r)
- searchResult = Search (i, x, cill((x+y)/2),r)
- else
- searchResult = Search(i, roof((x+y)/2), y,r)
- if (searchResult < dist)
- dist = searchResult;
- return dist;
- }
Add Comment
Please, Sign In to add comment