I'm wondering why the instruction FYL2XP1
on x86-architecture computes exactly the mathematical formula y · log2(x + 1).
这个公式有什么特别之处?
The y
操作数通常是一个编译时常量,暂时忘记x + 1
.
Since log_b(x) = log_b(2) * log_2(x)
该指令允许计算任何底数的对数x + 1
.
注意log_b(2)
是一个常数,因为很少需要计算具有基数自由度的对数。
FYL2XP1
and FYL2X
是仅有的两条计算对数的 x87 指令。
如果对数是一个代数函数,一条指令就足够了,但由于它是超越的,英特尔提供了两个版本。
FYL2X
适用于对数的整个域,但在整个范围内并不完全准确,特别是对于非常小的值x
(而且可能会更慢,我相信它必须缩小范围,使用截断的泰勒展开式或 Padé 近似,然后通过表查找来提高准确性)。
FYL2XP1
相反,仅适用于小范围 ±( 1 – sqrt(2) ⁄ 2 ) 内的输入。
这应该更快(因为没有范围缩小),更重要的是,对于给定的输入范围,使用的近似方法的精度应该等于或大于 x87 80 位浮点精度。
该指令为接近 0 的 epsilon 值 [寄存器 ST(0) 中的值] 提供最佳精度。
小 epsilon (ε) 值,可以通过使用保留更有效的数字FYL2XP1
指令而不是使用
(ε+1) 作为参数FYL2X
操作说明。
@Mysticial 的评论很到位 https://stackoverflow.com/questions/52736011/instruction-fyl2xp1/52740887?noredirect=1#comment92418458_52740887:
使用的算法FYL2X
在完成所有其他必要步骤之后,可能正在使用一个近似公式log(x + 1)
.
将其转化为一个公式log(x)
输入必须减一。一个x - 1
操作将失去精度,如果x
非常小(因为两个数字的指数之间的巨大差异将移动大部分x
的数字向右移动)。
FYL2XP1
不做x - 1
因此不会失去精度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)