我从其他人编写的代码中找到了以下两个功能,但我不太了解这些功能的作用。
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 ++是否有内置的替代函数。
答案 0 :(得分:5)
很容易看到,代码通过联合类型修剪将字节IEEE 754 binary32 float重新解释为32位无符号整数。然后,它使用按位运算来检查浮点数指数中的特定位。要了解其实际的作用,需要对binary32存储格式有全面的了解。
PD_BADFLOAT
检查the biased exponent是0还是最大值255为0 and 255 have special meanings(指数为0的是subnormal numbers和零; 255表示NaN和无穷大) 。但是请注意,这些不是错误的浮点数-但它们的行为也不像常规数。
第二个命令检查无偏指数是否在[-63,65]范围之外(该描述似乎在边界范围内是错误的),表示其幅度大于2⁶⁵(〜3.7 *10¹⁹)或小于2⁻ ⁶³(〜1.08 *10⁻¹⁹)。
所有这些都是非常特定于实现的且不可移植的-似乎这些编程都是出于速度考虑。
前者与标准宏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;
}