指令 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)
是一个常数,因为很少需要计算具有自由度的对数。
FYL2XP1
和 FYL2X
是仅有的两条计算对数的 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,并且可以安全地使用此功能。但是你需要记住,这个命令在参数错误的情况下不会抛出异常。
我想知道为什么 x86 架构上的指令 FYL2XP1
会精确计算数学公式 y · log2 (x + 1).
这个公式有什么特别之处?
y
操作数通常是一个编译时常量,暂时忘记x + 1
。
因为 log_b(x) = log_b(2) * log_2(x)
该指令允许计算 x + 1
的任何底数的对数。
请注意,log_b(2)
是一个常数,因为很少需要计算具有自由度的对数。
FYL2XP1
和 FYL2X
是仅有的两条计算对数的 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,并且可以安全地使用此功能。但是你需要记住,这个命令在参数错误的情况下不会抛出异常。