计算直流对数
Compute logarithms in dc
我在 bc 看到了 this question,但是在 dc 你是怎么做到的?例如,如果命令是 q
,我想这样使用它:
10k
5q2q/
计算log_2(5)
.
dc
中没有用于此的内置命令,但您可以实现任何 numerical methods 以将对数计算为宏。
例如,this one 使用 ln((1+y)/(1-y))
泰勒级数展开计算 ln(x)
:
# 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
我在 bc 看到了 this question,但是在 dc 你是怎么做到的?例如,如果命令是 q
,我想这样使用它:
10k
5q2q/
计算log_2(5)
.
dc
中没有用于此的内置命令,但您可以实现任何 numerical methods 以将对数计算为宏。
例如,this one 使用 ln((1+y)/(1-y))
泰勒级数展开计算 ln(x)
:
# 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