指令 FYL2XP1

Instruction FYL2XP1

我想知道为什么 x86 架构上的指令 FYL2XP1 会精确计算数学公式 y · log2 (x + 1).

这个公式有什么特别之处?

y操作数通常是一个编译时常量,暂时忘记x + 1

因为 log_b(x) = log_b(2) * log_2(x) 该指令允许计算 x + 1 的任何底数的对数。
请注意,log_b(2) 是一个常数,因为很少需要计算具有自由度的对数。

FYL2XP1FYL2X 是仅有的两条计算对数的 x87 指令。
如果对数是一个代数函数,一条指令就足够了,但由于它是超越数的,英特尔给出了两个版本。

FYL2X 适用于对数的整个域,但在整个范围内并不完全准确,特别是对于 x 的非常小的值(可能更慢,我相信它必须进行范围缩减,使用截断的泰勒展开或 Padé 近似,然后使用 table 查找提高准确性)。

FYL2XP1 而仅适用于小范围内的输入 ±( 1 – sqrt(2) ⁄ 2 ).
这应该更快(不缩小范围),更重要的是,对于给定的输入范围,所使用的近似方法的精度应等于或大于 x87 80 位浮点精度。

This instruction provides optimal accuracy for values of epsilon [the value in register ST(0)] that are close to 0. For small epsilon (ε) values, more significant digits can be retained by using the FYL2XP1 instruction than by using (ε+1) as an argument to the FYL2X instruction.

:
FYL2X 使用的算法可能在所有其他必要步骤之后使用 log(x + 1).
的近似公式 要将其转换为 log(x) 的公式,输入必须减去 1。如果 x 非常小,x - 1 操作将失去精度(因为两个数字的指数差异很大,会使 x 的大部分数字向右移动)。
FYL2XP1 不会做 x - 1 也不会丢失精度。

据我所知,该命令的常见描述存在不准确之处。从历史上看,此命令在 ±(1 – sqrt(2) ⁄ 2 ) 范围内不起作用,但在 sqrt(2) ⁄ 2 – 1 <= x <= sqrt(2) – 1 范围内起作用。这是范围使用多项式对该函数进行逼近。正是这样,因为对数 (x+1) 的参数范围的左右边界相差 2,这使得将此函数的结果扩展到任何 x> 相对容易-1。重要的是要注意,在所有现代处理器中,fyl2xp1 命令支持任何 x > -1,并且可以安全地使用此功能。但是你需要记住,这个命令在参数错误的情况下不会抛出异常。