理解glibc logf函数中的OFF值

理解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]内且精确。[

我试图理解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]内且精确。[…]*/

    我不明白为什么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;