-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathapproximate.py
executable file
·53 lines (48 loc) · 1.25 KB
/
approximate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python
from sys import argv
def approximate(n, m):
if n < 0.0:
num, den, val, dif, err = approximate(-n, m)
return (-num, den, -val, dif, err)
elif n == 0.0:
return (0, 1, 0.0, 0.0, 0.0)
else:
best_num = 1
best_den = 1
best_val = 1.0
best_dif = abs(1.0 - n)
best_err = best_dif / n
for den in range(1, m + 1):
num = int(round(n * float(den)))
val = float(num) / float(den)
dif = abs(val - n)
err = dif / n
if (dif < best_dif):
best_num = num
best_den = den
best_val = val
best_dif = dif
best_err = err
return (best_num, best_den, best_val, best_dif, best_err)
def run_approximate(n, m):
num, den, val, dif, err = approximate(n, m)
print(str(n) + u' \u2248 ' + str(num) + " / " + str(den) + " = " + str(val))
print("Delta: " + str(dif))
print("Error: " + str(err * 100.0) + "%")
def main():
if len(argv) <= 2:
print("usage: approximate <highest-denominator> <value> [<value> [...]]")
else:
try:
mm = max(1, abs(int(argv[1])))
for i in range(2, len(argv)):
if i > 2:
print("")
try:
n = float(argv[i])
run_approximate(n, mm)
except:
print(argv[i] + " is not a number")
except:
print(argv[1] + " is not an integer")
if __name__ == "__main__": main()