gpt4 book ai didi

c - 这些功能有什么作用?

转载 作者:行者123 更新时间:2023-11-30 20:46:39 24 4
gpt4 key购买 nike

我从别人写的代码中找到了以下两个函数,但我不太明白这些函数的作用。

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));
}

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

最佳答案

很容易看出,代码重新解释了字节 IEEE 754 binary32 float通过 union 类型双关作为 32 位无符号整数。然后,它使用按位运算来检查 float 指数中的特定位。要了解它的实际用途,需要对 binary32 存储格式有深入的了解。

<小时/>

PD_BADFLOAT 检查是否 the biased exponent是 0 或最大值 255,如 0 and 255 have special meanings (指数为 0 的为 subnormal numbers 和零;255 表示 NaN 和无穷大)。但请注意,这些不是坏 float - 但它们的行为也不像常规数字。

<小时/>

第二个检查无偏指数是否超出范围 [-63, 65](描述似乎与边界有关),这意味着其大小高于 2⁶⁵ (~ 3.7 * 10^⁹) 或低于 2⁻ ⁶³,(~ 1.08 * 10⁻1⁹)。

所有这些都是非常特定于实现的并且不可移植 - 似乎这些在编程时就考虑到了速度。

<小时/>

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

对于后者,我认为可移植的方式是使用 C99+ 函数 frexpffloat获取指数,然后与所需的限制进行比较,或者仅构造表示这些值的常量并将绝对值与这些限制进行比较。

因此类似

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;
}

关于c - 这些功能有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52113208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com