inf和nan含义如下:
INF表示“无穷大”,是infinite的缩写。NAN表示“无效数字”,是Not a number的缩写。
2.inf是不会崩溃的,但nan是会崩溃的
本人出现的情况:
仔细研究后发现,原来是我获取的 UIImage 对象 等于 nil 了,以至于 image.size.height 值 和 image.size.width 的值,都拿不到了;
那么image的宽高比 计算出来的 imageView 的 imageHeight 的值也就 成 NaN 了。
//部分代码
[cell.photo sd_setImageWithURL:[NSURL URLWithString:ad.imageUrl] placeholderImage:[UIImage imageNamed:@"defaultImage"] completed:^(UIImage *image, NSError *error, EMSDImageCacheType cacheType, NSURL *imageURL) {
imgHeight = image.size.height * [UIScreen mainScreen].bounds.size.width / image.size.width;
weakCell.photo.image = image;
//这种情况就比较特殊了,因为从后台那里拿到的image为nil,导致高度计算不合法,并且image需重新实例出来才有
if (isnan(imgHeight)){
UIImage *image = [UIImage imageNamed:@"defaultImage"];
weakCell.photo.image = image;
imgHeight = ScreenWidth;
}
延伸:
出现的情况:
inf一般是因为得到的数值,超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值);
而nan一般是因为对浮点数进行了未定义的操作,如对-1开方。
除以0
sizeWithFont的字符串为nil
数学函数不正确运算
举个例子:
1.0/0.0等于inf,-1.0/0.0等于-inf,0.0+inf=inf;
对负数开方sqrt(-1.0)、对负数求对数(log(-1.0))、0.0/0.0、0.0*inf、inf/inf、inf-inf这些操作都会得到nan。(0/0会产生操作异常;0.0/0.0不会产生操作异常,而是会得到nan)
解决方法:
- 找到调用参数nan或者inf 的语句加入逻辑判断(运用math类里的isnan):
if (!isnan(CGRectGetMidX(newFrame))) 就是当CGRectGetMidX不为无效参数调用此句.这样就可以解决崩溃了
2.( 得到inf时就查看是否有溢出或者除以0,得到nan时就查看是否有非法操作。)
nan==nan 结果是0或false,即不能和nan进行比较,和nan进行比较得到的结果总是false或0。所以可以用函数: int isNumber(double d){return (d==d);}来判断d是否为nan,若d是nan则返回0,否则返回非零值
float ecg;
if(isnan(ecg)){ //isnan为系统函数
//you code
ecg = 0.0;
}
else {
//you code
}
//inf同理
if (isinf(height)) {
height=0.0f;
}