我从其他人编写的代码中发现了以下两个函数,但我并不真正理解这些函数的作用.
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++中是否有任何内置的替代函数.
由于很容易看到,代码通过联合类型双关语将字节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)