int is_infinity/is_zero/is_denormal(float f){
//do something, return 0 or 1
}
This is what I did for checking if a float is negative. I want to do something similar for the other functions, but I'm not sure how.
int is_negative(float val){
union sp_object copy;
copy.frep = val;
if((copy.irep & 0x80000000) != 0)
return 1;
else
return 0;
}
I want to do something similar for the other functions
Avoid bit fields, @David, as it depends on implementation specifics. <math.h> contains macros to classify a float. These macros work for double and long double too.
#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';
}
Or maybe simply
bool is_infinity_is_zero_is_denormal(float f) {
return !(isnormal(f) || isnan(f));
}
Also see int fpclassify(real-floating x); to classify the number in one step.
classifies its argument value as NaN, infinite, normal, subnormal, zero, or into another implementation-defined category. C11 §7.12.3.1 2
The number classification macros
FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL FP_ZEROrepresent the mutually exclusive kinds of floating-point values. They expand to integer constant expressions with distinct values. §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;
}
Let the compiler handle the optimization.
ISO C99 provides an INFINITY and NAN macro that can be compared against. It is recommended to use the functions isfinite(), isnormal(), and isnan(). Note that as EOF points out, comparing against the NAN macro will not determine whether a value is actually NAN.
For C99:
https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html
For earlier code you're out of luck:
User contributions licensed under CC BY-SA 3.0