MZ9*_*Z97 4 floating-point x86 assembly instructions x87
我想知道为什么FYL2XP1x86 架构上的指令精确地计算数学公式 y · log 2 ( x + 1)。
这个公式有什么特别之处?
该y操作通常是一个编译时间常数,一时忘记了x + 1。
由于log_b(x) = log_b(2) * log_2(x)该指令允许以 的任何底数计算对数x + 1。
请注意,这log_b(2)是一个常数,因为很少需要计算具有基数自由度的对数。
FYL2XP1和FYL2X是仅有的两条计算对数的 x87 指令。
如果对数是代数函数,一条指令就足够了,但由于它是超越的,英特尔给出了两个版本。
FYL2X适用于对数的整个域,但在整个范围内并不完全准确,特别是对于非常小的值x(可能更慢,我相信它必须进行范围缩减,使用截断的泰勒展开或帕德近似和而不是通过查表提高准确性)。
FYL2XP1而是仅适用于小范围内的输入 ±( 1 – sqrt(2) ? 2 )。
这应该更快(不减少范围),更重要的是,对于给定的输入范围,所使用的近似方法的精度应等于或大于 x87 80 位浮点精度。
此指令为接近 0 的 epsilon [寄存器 ST(0) 中的值] 的值提供最佳精度。对于较小的 epsilon (?) 值,使用 FYL2XP1 指令可以保留比使用 (?+ 1) 作为 FYL2X 指令的参数。
@Mysticial 的评论是一个点:在所有其他必要步骤之后, 使用
的算法FYL2X可能正在使用 的近似公式log(x + 1)。
要将其转换为公式,log(x)输入必须减一。一x - 1,如果操作将失去精度x是非常小的(因为在两个数字的指数较大的差异会转移大部分x的数字向右边)。
FYL2XP1不会x - 1,也不会失去精度。