To find these fractions I've written a Python 3 program which calculates the errors of various fractions when compared to pi. It works in the following way:
First, it considers a range of denominators to use for fractions. For each denominator, the numerator which makes the fraction closest to pi is found (for example, with a denominator of 7, the closest fraction would be 22/7).
Each fraction will get a number of digits at the beginning the same as pi. We would like to find which is the closest fraction to pi which gets, say, the first 5 digits exactly like pi's. So the best fraction for every number of exact digits is found.
Approximations are only useful if they are easy to use and remember and so we will be considering different lengths of numbers when performing the above process. First we shall find the best fractions which consist of a denominator which is less than 10, then which is less than 100, then 1000, etc. in order to control the sizes of the fractions.
Here is the code:
import math import collections def closestFraction(denominator, target): #The closest fraction which uses a particular denominator d to a target number t requires that we find the best numerator n such that n/d = t, so n = td, the closest whole number of which is round(td) numerator = round(denominator*target) fraction = numerator/denominator return (numerator, denominator, fraction) def closestFractions(maxDenominatorRange, target): fractions = [] fractionsFound = set() for denominator in range(1, maxDenominatorRange): (numerator, denominator, fraction) = closestFraction(denominator, target) if fraction not in fractionsFound: #avoid different forms of the same fraction due to non-simplification fractionsFound.add(fraction) fractions.append((numerator, denominator, fraction)) return fractions print("pi =", math.pi) print() for maxDenominatorRange in [10, 100, 1000, 10000, 100000]: #Group fractions by the number of first digits which are exactly like pi's numFirstDigitsDict = collections.defaultdict(list) for (numerator, denominator, fraction) in closestFractions(maxDenominatorRange, math.pi): numFirstDigits = 0 while round(fraction, numFirstDigits) == round(math.pi, numFirstDigits): numFirstDigits += 1 numFirstDigits -= 1 numFirstDigitsDict[numFirstDigits].append((numerator, denominator, fraction)) #Keep only the best fraction in each first digits group bestNumFirstDigitsDict = dict() for numFirstDigits in numFirstDigitsDict: bestNumFirstDigitsDict[numFirstDigits] = min(numFirstDigitsDict[numFirstDigits], key=lambda x:abs(x[2] - math.pi)) print("==========") print("Fractions with denominator less than", maxDenominatorRange) for numFirstDigits in bestNumFirstDigitsDict: (numerator, denominator, fraction) = bestNumFirstDigitsDict[numFirstDigits] print("Best fraction with", numFirstDigits, "starting digits like pi's (rounded):", numerator, "/", denominator, "=", fraction) print()
And here are the results:
pi = 3.141592653589793 ========== Fractions with denominator less than 10 Best fraction with 0 starting digits like pi's (rounded): 19 / 6 = 3.1666666666666665 Best fraction with 1 starting digits like pi's (rounded): 25 / 8 = 3.125 Best fraction with 2 starting digits like pi's (rounded): 22 / 7 = 3.142857142857143 ========== Fractions with denominator less than 100 Best fraction with 0 starting digits like pi's (rounded): 167 / 53 = 3.150943396226415 Best fraction with 1 starting digits like pi's (rounded): 195 / 62 = 3.1451612903225805 Best fraction with 2 starting digits like pi's (rounded): 311 / 99 = 3.1414141414141414 ========== Fractions with denominator less than 1000 Best fraction with 0 starting digits like pi's (rounded): 167 / 53 = 3.150943396226415 Best fraction with 1 starting digits like pi's (rounded): 412 / 131 = 3.145038167938931 Best fraction with 2 starting digits like pi's (rounded): 2975 / 947 = 3.1414994720168954 Best fraction with 3 starting digits like pi's (rounded): 3085 / 982 = 3.1415478615071284 Best fraction with 4 starting digits like pi's (rounded): 2818 / 897 = 3.141583054626533 Best fraction with 6 starting digits like pi's (rounded): 355 / 113 = 3.1415929203539825 ========== Fractions with denominator less than 10000 Best fraction with 0 starting digits like pi's (rounded): 167 / 53 = 3.150943396226415 Best fraction with 1 starting digits like pi's (rounded): 412 / 131 = 3.145038167938931 Best fraction with 2 starting digits like pi's (rounded): 15541 / 4947 = 3.1414998989286436 Best fraction with 3 starting digits like pi's (rounded): 28497 / 9071 = 3.1415499944879284 Best fraction with 4 starting digits like pi's (rounded): 26669 / 8489 = 3.1415950053009776 Best fraction with 5 starting digits like pi's (rounded): 31218 / 9937 = 3.1415920297876623 Best fraction with 6 starting digits like pi's (rounded): 355 / 113 = 3.1415929203539825 ========== Fractions with denominator less than 100000 Best fraction with 0 starting digits like pi's (rounded): 167 / 53 = 3.150943396226415 Best fraction with 1 starting digits like pi's (rounded): 412 / 131 = 3.145038167938931 Best fraction with 2 starting digits like pi's (rounded): 15541 / 4947 = 3.1414998989286436 Best fraction with 3 starting digits like pi's (rounded): 28497 / 9071 = 3.1415499944879284 Best fraction with 4 starting digits like pi's (rounded): 294069 / 93605 = 3.14159500026708 Best fraction with 5 starting digits like pi's (rounded): 198379 / 63146 = 3.1415924999208182 Best fraction with 6 starting digits like pi's (rounded): 308429 / 98176 = 3.141592649934811 Best fraction with 7 starting digits like pi's (rounded): 209761 / 66769 = 3.141592655274154 Best fraction with 8 starting digits like pi's (rounded): 208341 / 66317 = 3.1415926534674368 Best fraction with 9 starting digits like pi's (rounded): 104348 / 33215 = 3.141592653921421 Best fraction with 10 starting digits like pi's (rounded): 312689 / 99532 = 3.1415926536189365
In my opinion, the best fraction is 355/113 which is easy to remember and is accurate up to 6 digits:
pi = 3.141592653589793 355/113 = 3.1415929203539825
Hi Just came across this - very cool :-)
ReplyDelete