Math 我需要一位浮点运算专家

Math 我需要一位浮点运算专家,math,floating-point,ieee-754,logarithm,Math,Floating Point,Ieee 754,Logarithm,有人能详细解释一下log2函数是如何工作的吗 inline float fast_log2 (float val) { int * const exp_ptr = reinterpret_cast <int *> (&val); int x = *exp_ptr; const int log_2 = ((x >> 23) & 255) - 128; x &= ~(255 <<

有人能详细解释一下log2函数是如何工作的吗

inline float fast_log2 (float val)
{
   int * const    exp_ptr = reinterpret_cast <int *> (&val);
   int            x = *exp_ptr;
   const int      log_2 = ((x >> 23) & 255) - 128;
   x &= ~(255 << 23);
   x += 127 << 23;
   *exp_ptr = x;

   val = ((-1.0f/3) * val + 2) * val - 2.0f/3;   // (1)

   return (val + log_2);
} 

这是一个近似值。它首先直接取指数的log2,然后使用尾数的log2的近似公式。然后将这两个log2组件相加,得到最终结果。

这是一个近似值。它首先直接取指数的log2,然后使用尾数的log2的近似公式。然后将这两个log2分量相加,得出最终结果。

IEEE浮点内部有一个指数E和一个尾数M,每个都表示为二进制整数。实际值基本相同

2^E * M
基本对数数学说:

  log2(2^E * M) 
= log2(2^E) + log2(M)
= E + log2(M)

代码的第一部分将E和M分开。注释1的行使用多项式近似计算log2M。最后一行加上E和近似结果。

IEEE浮点内部有一个指数E和尾数M,每个都表示为二进制整数。实际值基本相同

2^E * M
基本对数数学说:

  log2(2^E * M) 
= log2(2^E) + log2(M)
= E + log2(M)

代码的第一部分将E和M分开。注释1的行使用多项式近似计算log2M。最后一行加上E和近似结果。

好的,我可以理解它是如何提取指数并将其放入名为log_2的整数中的,以及它是如何提取符号位和尾数并通过指针将其保存到val的。我不明白的是为什么把它们加在一起,我知道一旦它提取符号位和尾数,它就会设置exp=1270,因此val=signbit*分数。但它是如何工作的,加上log_2,才是真正让我感到困扰的。它实际上并没有提取指数,它所做的是提取指数-1,因为IEEE 754是signbit*2^exp-127*frac@Skeen:好的-这是一个微妙的点-尾数有一个隐式的1,所以它的值在1.0到2.0之间,所以你有一个额外的2次幂需要处理。好的,我可以理解它如何提取指数并将其放入名为log_2的整数中,以及它如何提取符号位和尾数并通过指针将其保存到val。我不明白的是为什么把它们加在一起,我知道一旦它提取符号位和尾数,它就会设置exp=1270,因此val=signbit*分数。但它是如何工作的,加上log_2,才是真正让我感到困扰的。它实际上并没有提取指数,它所做的是提取指数-1,因为IEEE 754是signbit*2^exp-127*frac@Skeen:好的-这是一个微妙的点-尾数有一个隐式的1,所以它的值在1.0到2.0之间,所以你有一个额外的2次幂需要处理。哦>。等等!指数被表示为一个两补整数,因此,为什么还有一个正数而不是负数。嗯?@Skeen:不,我错了,并且改正了。至于那个偏移量,我不确定。实际上可能是代码中的一个错误。@Skeen:是的,这是两个的补充,但根据维基百科的说法,偏差仍然只有127。这可能与尾数的最大有效位未存储且假定为1的规范化表示有关。@Michael Borgrwardt:这是因为尾数有一个隐式的1,所以这给了你额外的2次幂来处理。哦>。等等!指数被表示为一个两补整数,因此,为什么还有一个正数而不是负数。嗯?@Skeen:不,我错了,并且改正了。至于那个偏移量,我不确定。实际上可能是代码中的一个错误。@Skeen:是的,这是两个的补充,但根据维基百科的说法,偏差仍然只有127。这可能与尾数的最大有效位未存储且假定为1的规范化表示有关。@Michael Borgrwardt:这是因为尾数有一个隐式的1,所以这给了你额外的2次幂来处理。