math
— это модуль Python, используемый многими для выполнения немного более сложных математических функций и использующий модуль decimal
. Можно правильно вычислить 1.2-1.1=0.0999~
, но используя тип decimal
, это 0.1
.
Моя проблема в том, что эти два модуля плохо работают друг с другом. Например, log(1000, 10)=2.9999~
, но использование типа decimal
дает тот же результат. Как я могу заставить эти два работать друг с другом? Нужно ли мне реализовывать свои собственные функции? Нет ли способа?
В Decimal есть метод log10.
from decimal import *
a = Decimal('1000')
print(a.log10())
Однако для меня было бы более разумно использовать функцию, которая вычисляет точное значение логарифма, если вы пытаетесь решить логарифмы с точными целочисленными решениями. Обычно ожидается, что логарифмические функции при типичном использовании выдают некоторый иррациональный результат. Вместо этого вы можете использовать цикл for и повторяющееся деление.
У вас есть методы Decimal.log10
, Decimal.ln
и Decimal.logb
каждого экземпляра Decimal
и многие другие (max
, sqrt
):
from decimal import Decimal
print(Decimal('0.001').log10())
# Decimal('-3')
print(Decimal('0.001').ln())
# Decimal('-6.907755278982137052053974364')
Однако функций тригонометрии нет.
Более продвинутой альтернативой для вычислений с произвольной точностью является mpmath, доступная на PyPI. Конечно, он также не даст вам sin
или tan
, потому что sin(x)
иррационально для многих значений x
, и поэтому хранить его как Decimal
не имеет смысла. Однако, учитывая фиксированную точность, вы можете вычислить эти функции с помощью ряда Tailor и т. д. с помощью mpmath
. Вы также можете сделать Decimal(math.sin(0.17))
, чтобы получить десятичную дробь, содержащую что-то близкое к синусу 0,17 радиана.
Также смотрите официальные рецепты Decimal.
Можете ли вы полностью сохранить свои расчеты в среде модуля
decimal
? Например.decimal.Decimal(1000).log10()
->Decimal('3')
.