Как я могу сделать вывод в радианах с числом pi в нем?

#python #numpy #angle #pi #radians

#python #numpy #угол #pi #радианы

Вопрос:

Я хочу выдать угол в радианах на python. Я также знаю, как это сделать, но возможно ли сделать вывод таким, как 1 * pi вместо 3.14159, не программируя его самостоятельно?

Спасибо за помощь.

Комментарии:

1. разделите на pi , и вы получите 1 , а позже вам придется самостоятельно отображать его как 1 * pi — но 3.14159 это всего лишь оксимация, чтобы вы могли получить 1.1 или 0.9 вместо 1 . В конце концов, вы можете попробовать использовать модуль sympy для символьной математики

2. также обратите внимание, что в numpy доступны некоторые константы (например, pi)

3. нет функции для преобразования 3.14159 в string 1 * pi и 6.28318 as 2*pi , и вам придется делать это самостоятельно (путем divede by pi ). Проблема в том, что pi это только приблизительно, и вы можете получить 1.01 * pi или 0.99 * pi вместо 1 * pi . Для некоторых углов вы можете просто использовать dictionary {30: "PI/6", 45: "PI/4", 60: "PI/3", ... 180: "PI", ...} . Потому что вы должны использовать строки "PI/6" , "PI/4" , "PI/3" так что вы даже можете использовать строки π/6, π/4, π/3 . ВИкипедия: Радиан имеет таблицу со значениями.

4.Кстати: на основе радиана radian = angle/180 * pi Википедии, чтобы вы могли использовать его для отображения с помощью PI — print(angle/180, "* pi") перед преобразованием в radian

Ответ №1:

Точно так же (см. комментарий Фураса) :

 from math import pi

angle = 2*pi
angle_new_format = angle/pi
print("angle =", angle)
print("angle_new_format = {} * pi".format(angle_new_format))
  

Вывод :

 angle = 6.283185307179586
angle_new_format = 2.0 * pi
  

Ответ №2:

Я написал эту функцию, которая найдет хорошую долю числа пи, используя Fraction.limit_denominator , а затем очищает вывод, чтобы написать «пи» вместо «пи / 1» и «0» вместо «0,0 пи» и т.д.

 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))
  

Играя с необязательным параметром max_denominator , вы можете выбирать между более круглыми дробями или более точными дробями; например, rad_to_pifrac(22/7, max_denominator=1000) is 'pi' но rad_to_pifrac(22/7, max_denominator=2000) is '2001pi/2000' .

Некоторые тесты:

 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