isnan(), isinf()
直到C99才在规范中,反正在C89中实现这样的功能吗?
我可以使用if (d * 0 != 0)
来检查d是NaN还是Inf,但我们总是使用选项-Werror=float-equal
编译我们的项目,该选项想大声疾呼:error: no == or != on float point value
然后人们如何在C89中检查nan和inf?
如果您的系统使用IEEE 754 Standard表示浮点值(大多数情况下这样做的话),则可以显式检查NaN
和inf
值。单精度(32位)浮点值具有1
符号位(位31),8 bit
指数(位30-23)和23 bit
尾数] (第22-0位),布局如下(二进制格式):
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM
infinity值用全1的指数和全0的尾数表示(符号位区分负无穷大和正无穷大)。
A NaN值由所有1的指数和非零分数表示(a quiet NaN的尾数位最高[float
“转换”为一个无符号的32位整数,我们可以显式检查这些表示形式(假设unsigned int
是32位类型:]
int IsInfinite(float test) {
unsigned int mask = *(unsigned int *)(&test);
return ( (mask & 0x7F800000) == 0x7F800000 && (mask & 0x007FFFFF) == 0 );
}
int NotANumber(float test) {
unsigned int mask = *(unsigned int *)(&test);
return ( (mask & 0x7F800000) == 0x7F800000 && (mask & 0x007FFFFF) != 0 );
}
双精度值的表示类似,但是具有11
指数位(62-52)和52
尾数位(51-0)。
isinf(x)
和isnan(x)
在[x
的real-floating