已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
四年前关闭了。
Improve this question
我知道在java中通过Math.log来计算日志很容易,但是在汇编中没有这样的就绪函数,这是如何工作的呢?
已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
四年前关闭了。
Improve this question
我知道在java中通过Math.log来计算日志很容易,但是在汇编中没有这样的就绪函数,这是如何工作的呢?
1条答案
按热度按时间nqwrtyyt1#
要方便地计算对数,请使用x87 FPU的
FYL2X
指令。此指令计算st1 * log2(st0)
,然后弹出寄存器堆栈。由于这是一个双对数,因此需要首先压入合适的转换因子。幸运的是,FPU的ROM中内置了合适的转换因子,可通过特殊指令访问:注意SSE或AVX没有类似的指令;如果不想使用x87 FPU,则必须通过数值近似手动计算对数。不过,这通常比直接使用
fyl2x
要快。可以在使用SSE进行浮点数学运算的程序中使用此代码;只需将数据移到x87 FPU来计算对数。由于无法直接从SSE寄存器移到x87 FPU,因此必须遍历堆栈: