调用__builtin_isnan函数时传入非浮点型参数的问题排查
解决
__builtin_isnan调用时的非浮点型参数错误 嘿,这个问题很好搞定!你碰到的错误核心就是传给isnan()的参数类型不对——它要求接收浮点型(比如double、float),但你用了整数表达式1/0,编译器直接就报错了。
为什么会出错?
你代码里的1/0是整数除法:两个整数做除法,结果还是整数类型。但isnan()是用来判断浮点数值是否为NaN(非数字)的函数,根本不接受整数参数,所以编译器直接抛出了non-floating-point argument的错误。而且顺带提一句,整数除法里除以0本身也是未定义行为,运行时会直接崩溃,这也是个隐藏坑。
怎么修复?
有两种简单的解决方式,优先推荐第一种:
- 改用浮点字面量:把
1和0改成1.0和0.0,这样就会触发浮点除法,得到的结果是inf(正无穷大),属于double类型,完全符合isnan()的参数要求。修改后的代码如下:
#include <stdio.h> #include <math.h> int main() { printf ("isnan(1.0/0.0): %d\n", isnan(1.0/0.0)); return 0; }
- 强制类型转换(适合特殊场景):如果你的参数是整数变量或者必须用整数表达式,可以把它强制转换成浮点型,比如
isnan((double)(your_integer_value))。但还是那句话,整数除以0本身就是错误,这种情况尽量避免。
另外补充个小细节:有些编译器可能需要你定义_ISOC99_SOURCE宏才能正常使用isnan(),不过你已经包含了math.h,只要编译器支持C99及以上标准,这个问题就不用操心。
内容的提问来源于stack exchange,提问作者Armin Rahimi
相关产品推荐
相关产品推荐

