人们如何在C89中检查nan和inf

问题描述 投票:3回答:2

isnan(), isinf()直到C99才在规范中,反正在C89中实现这样的功能吗?

我可以使用if (d * 0 != 0)来检查d是NaN还是Inf,但我们总是使用选项-Werror=float-equal编译我们的项目,该选项想大声疾呼:error: no == or != on float point value

然后人们如何在C89中检查nan和inf?

c nan c99 c89
2个回答
1
投票

如果您的系统使用IEEE 754 Standard表示浮点值(大多数情况下这样做的话),则可以显式检查NaNinf值。单精度(32位)浮点值具有1 符号位(位31),8 bit 指数(位30-23)和23 bit 尾数] (第22-0位),布局如下(二进制格式):

SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM

infinity值用全1的指数和全0的尾数表示(符号位区分负无穷大和正无穷大)。

A NaN值由所有1的指数和非零分数表示(a quiet NaN的尾数位最高[,而signaling 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)。 

0
投票
由于C99,isinf(x)isnan(x)在[x

real-floating

© www.soinside.com 2019 - 2024. All rights reserved.