Вычислить логарифмы в DC

Я видел этот вопрос для BC, но как вы делаете это в DC? Например, если команда была qЯ хотел бы использовать это так:

10k
5q2q/

Вычислить log_2(5),

1 ответ

Решение

Там нет встроенной команды для этого в dc, но вы можете реализовать любой из численных методов для вычисления логарифма в виде макросов.

Например, этот вычисляет ln(x) с помощью ln((1+y)/(1-y)) Расширение серии Тейлор:

# L (x -- y)
# Natural logarithm of `x`.
[ 1-d2+/
  d2*Sk              # Initialize multiplier
  d*Sy               # Initialize multiplier factor
  0Ss                # Initialize accumulator
  10K^Sp             # Initialize 10^k power
  [ d1r/lk*ls+lsrdss   # Update accumulator
    -lp*d*1 [s_q]s_>_  # Check precision
    lkly*sk 2+         # Update multiplier and counter
    lfx
  ]Sf
  1lfxLs
LkLyLpLfs_s_s_s_] sL

Используйте это так:

10k
5lLx 2lLx /p

Это не оптимально, особенно для больших чисел (x ≫ 1), но метод с более быстрой сходимостью также может быть реализован таким образом, если это необходимо.

Сжатый вариант (несколько быстрее):

[1-d2+/d2*Skd*Sy0Ss10K^Sp[d1r/lk*ls+lsrdss-lp*d*1[s_q]s_>_lkly*sk2+lfx]Sf1lfxLsLkLyLpLfs_s_s_s_]sL
Другие вопросы по тегам