I want to give out an angle in radians in python. I also know how to do that but is it posible to make the output like that 1 * pi instead of 3.14159 without programming it myself?
Thx for help.
I wrote this function, which will find a nice fraction of pi using Fraction.limit_denominator
, and then cleans up the output to write "pi" instead of "pi/1" and "0" instead of "0.0 pi", etc.
from math import pi
from fractions import Fraction
def rad_to_pifrac(rad, max_denominator=8000):
pifrac = Fraction(rad / pi).limit_denominator(max_denominator)
if pifrac == 0:
return '0'
num = {1: '', -1: '-'}.get(pifrac.numerator, str(pifrac.numerator))
denom = '/{}'.format(pifrac.denominator) if pifrac.denominator != 1 else ''
return 'pi'.join((num, denom))
By toying with the optional parameter max_denominator
you can adjust between rounder fractions or more accurate fractions; for instance, rad_to_pifrac(22/7, max_denominator=1000)
is 'pi'
but rad_to_pifrac(22/7, max_denominator=2000)
is '2001pi/2000'
.
Some tests:
import sympy
def test_pi(max_denominator=100):
testcases = ['0', '1', '22/7', '0.39', '0.393', '3', '3.14', 'pi/8', 'pi/4', '-pi/4', '3*pi/4', '-3*pi/4', '-pi', 'pi', '2*pi', '6.28']
print('max_denominator={}'.format(max_denominator))
for s in testcases:
value = float(sympy.parse_expr(s).evalf())
pifrac = rad_to_pifrac(value, max_denominator=max_denominator)
print('{:10s} ----> {}'.format(s, pifrac))
>>> test_pi()
max_denominator=100
0 ----> 0
1 ----> 7pi/22
22/7 ----> pi
0.39 ----> 12pi/97
0.393 ----> pi/8
3 ----> 85pi/89
3.14 ----> pi
pi/8 ----> pi/8
pi/4 ----> pi/4
-pi/4 ----> -pi/4
3*pi/4 ----> 3pi/4
-3*pi/4 ----> -3pi/4
-pi ----> -pi
pi ----> pi
2*pi ----> 2pi
6.28 ----> 2pi
Just like this (cf furas's comment) :
Output :