int is_infinity/is_zero/is_denormal(float f){
//do something, return 0 or 1
}
Run Code Online (Sandbox Code Playgroud)
这就是我检查 afloat是否为负时所做的。我想为其他功能做类似的事情,但我不确定如何。
int is_negative(float val){
union sp_object copy;
copy.frep = val;
if((copy.irep & 0x80000000) != 0)
return 1;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想为其他功能做类似的事情
避免位字段@David,因为它取决于实现细节。 <math.h>包含用于对float. 这些宏的工作double和long double太多。
#include <math.h>
// Adjust returns values as desired.
int is_infinity_is_zero_is_denormal(float f) {
if (isinf(f)) return 'i';
if (f == 0.0f) return 'z';
if (isnan(f)) return 'n';
if (isnormal(f)) return 0; // neither zero, subnormal, infinite, nor NaN
// All that is left is de-normal/sub-normal.
return 'd';
}
Run Code Online (Sandbox Code Playgroud)
或者也许只是
bool is_infinity_is_zero_is_denormal(float f) {
return !(isnormal(f) || isnan(f));
}
Run Code Online (Sandbox Code Playgroud)
另请参阅int fpclassify(real-floating x);一步一步地对数字进行分类。
将其参数值分类为 NaN、无穷大、正常、次正常、零或另一个实现定义的类别。C11 §7.12.3.1 2
数字分类宏
FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL FP_ZERO表示相互排斥的浮点值类型。它们扩展为具有不同值的整数常量表达式。§7.12 6
bool is_infinity_is_zero_is_denormal(float f) {
// return fpclassify(f) & (FP_INFINITE | FP_ZERO | FP_SUBNORMAL); // not good
switch (fpclassify(f)) {
case FP_INFINITE:
case FP_ZERO:
case FP_SUBNORMAL:
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
让编译器处理优化。
Dav*_*vid -1
ISO C99 提供了一个可以进行比较的INFINITYand宏。NAN建议使用函数isfinite()、isnormal()、 和isnan()。请注意,正如 EOF 指出的那样,与NAN宏进行比较并不能确定某个值是否实际上是NAN。
对于 C99:
https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html
对于早期的代码,你运气不好: