Вычислить логарифмы в 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