C 为什么快速平方反比使用十六进制?

C 为什么快速平方反比使用十六进制?,c,C,我只是对这个很好奇,在上面找不到任何东西。它使用十六进制是有原因的,还是仅仅因为它最初是这样写的 以下代码仅供参考 float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; i = 0x5f3759df - (

我只是对这个很好奇,在上面找不到任何东西。它使用十六进制是有原因的,还是仅仅因为它最初是这样写的

以下代码仅供参考

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;
    i  = 0x5f3759df - ( i >> 1 );
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );
//  y  = y * ( threehalfs - ( x2 * y * y ) );

    return y;
}

对于编译器来说,以十六进制或十进制表示的数字没有区别。使用十六进制的原因是它使程序员更容易理解

在这种情况下,程序员正在以浮点数操作位模式,因此值的位布局比其数值更重要

由于十六进制值将每个字符直接映射到四位,因此在本例中它是自然表示

有关此特定函数(快速平方根逆)的更多信息,请参见此处:


不,他们只是在炫耀,因为他们可以;顺便说一句,这个可能的复制品完全是UB。有一个版本是关于使用union的,它仍然是UB,但是只要实现真正使用IEEE-754浮点表示,就可以很好地定义它。它可能在Q3中使用,因为它通常比fsqrt处理器指令更快,尽管精度较低,但在当时,这很重要。我认为它在今天的计算机上已经过时了,但是,当然,仍然有趣地添加到我以前的评论:过时的手工使用当然。某些3D硬件可能在内部使用这种方法。@FelixPalmen在严格的别名规则下,联合技巧与指针双关一样有效。获取浮点位数的唯一有效方法是使用memcpy,或对char*进行类型双关,因为char类型不受严格的别名规则的约束。值得注意的是,Carmack通常(但错误地)没有显示属性,并在代码的其他地方对两个浮点数使用十六进制。常量本身不是浮点数。@Jongware,正确。0x5f3759df不是浮点数,它是一种位模式,用于与值y一起生成平方根的第一个估计值。