理解glibc logf函数中的OFF值
我试图理解GNUC库中对数实现的机制,可以在glibc>sysdeps>ieee754>flt-32>e_logf.C下找到 尤其是OFF值(0x3f330000)在两个方面让我感到困扰理解glibc logf函数中的OFF值,c,floating-point,glibc,logarithm,C,Floating Point,Glibc,Logarithm,我试图理解GNUC库中对数实现的机制,可以在glibc>sysdeps>ieee754>flt-32>e_logf.C下找到 尤其是OFF值(0x3f330000)在两个方面让我感到困扰 它是如何得到指数k的?我知道浮点是整数解释,然后移位位,然后以偏移方式减去,例如,对于(正)浮点x=2^k*z intk=(asuint(x)>>23)-127 在这里,它似乎起到了相反的作用,但我不明白它是如何起作用的 此外,还有这样的评论: /*x=2^kz;其中z在范围[OFF,2*OFF]内且精确。[
intk=(asuint(x)>>23)-127代码>
在这里,它似乎起到了相反的作用,但我不明白它是如何起作用的
此外,还有这样的评论:
/*x=2^kz;其中z在范围[OFF,2*OFF]内且精确。[…]*/
我不明白为什么z(我理解的尾数)会在这个区间,而不是[1,2]
还有更多我不知道的,但一旦我明白了OFF代表什么,也许我能弄明白。任何帮助都将不胜感激!首先回答第二个问题
此外,还有这样的评论:
我不明白为什么z(我理解的尾数)会
躺在那个区间,而不是[1,2]
关于该公式,解释z
二进制表示的位的位置值,使得z
总是落在任何特定的非空间隔中,这只是一个如何选择k
的问题。因此,可以将z
位于注释中指定的特定间隔中作为定义如果没有这样的定义,满足公式的z
和k
对是无限多的
如何使用[OFF
]来获得指数k?我知道浮点是整数解释,然后移位并减去偏差,例如(正)浮点x=2^k*z
int k=(asuint(x)>>23)-127
在这里,它似乎反过来工作,但我不明白如何
那就行了
你可以先移位再减法,或者先减去一个不同的移位值再移位。你可以用代数方法在这两种形式之间来回转换。这只是在加法运算上分配一个乘法运算,而不是分解它
为OFF
定义的值等于((126问题中引用的代码很可能基于这样的假设,即C类型float
映射到IEEE-754浮点标准的binary32
类型。John Bollinger已经解决了参数缩减过程中使用的binary32
数字的位级操作
在没有查看代码的情况下,仅根据问题中的代码注释就可以清楚地看出,OFF
表示代码使用的核心近似值有效的区间下限。具体而言,0x3f3300
指定的位模式被解释为binary32
数字对应nds到值0x1.660000p-1
,约为0.69921875。正如引用的代码注释所指出的,上限是下限的两倍,约为1.3984375
log
的典型实现最终将log1p
近似为零,这意味着它们将log
近似为单位。核心近似值的下限为>=exp(-0.5)
~=0.60653,上限为
/* x = 2^k z; where z is in range [OFF,2*OFF] and exact. [...] */
tmp = ix - OFF;
k = (int32_t) tmp >> 23; /* arithmetic shift */
k = (ix - (126 << 23) - 0x330000) >> 23;