这些功能有什么作用?

Zac*_*Lee -3 c

我从其他人编写的代码中发现了以下两个函数,但我并不真正理解这些函数的作用.

typedef  union
{
    t_float f; //float
    unsigned int ui;
}t_bigorsmall32;

static inline int PD_BADFLOAT(t_float f)  /* malformed float */
{
    t_bigorsmall32 pun;
    pun.f = f;
    pun.ui &= 0x7f800000;
    return((pun.ui == 0) | (pun.ui == 0x7f800000));
}

static inline int PD_BIGORSMALL(t_float f)  /* exponent outside (-64,64) */
{
    t_bigorsmall32 pun;
    pun.f = f;
    return((pun.ui & 0x20000000) == ((pun.ui >> 1) & 0x20000000));
}
Run Code Online (Sandbox Code Playgroud)

如果有人能解释他们的所作所为,我将不胜感激.我还想知道标准库或C++中是否有任何内置的替代函数.

Ant*_*ala 5

由于很容易看到,代码通过联合类型双关语将字节IEEE 754 binary32 float重新解释为32位无符号整数.然后,它使用逐位操作来检查浮点数的指数中的特定位.了解它的实际功能需要复杂的binary32存储格式知识.


PD_BADFLOAT检查偏差指数是0还是最大值255为0和255具有特殊含义(指数为0的是次正规数和零; 255表示NaN和无穷大).但请注意,这些浮点数并不差 - 但它们的行为也不像常规数字.


第二个检查无偏指数是否超出范围[-63,65](描述似乎是错误的界限),意味着它的幅度高于2⁶⁵(~3.7*10¹)或低于2-3³,( ~1.08*10 -1).

所有这些都是特定于实现和不可移植的 - 似乎这些都是以速度编程的.


前者与标准宏的否定完全相同isnormal.

对于后者,我认为可移植的方法是使用C99 +函数frexpf从中得到指数float,然后与期望的限制进行比较,或者仅通过构造表示这些值的常数并将绝对值与这些限制进行比较.

因此有点像

static inline int PD_BADFLOAT(float f) {
    return !isnormal(f);
}

static inline int PD_BIGORSMALL(float f) {
    int exp;
    if (isnormal(f)) {
        frexpf(f, &exp);
        return exp < -63 || exp > 65;
    }

    // return 1 for subnormal numbers and
    // NaN, INF...
    return 1;
}
Run Code Online (Sandbox Code Playgroud)