计算值时为Nan / inf

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;
        }


延伸:

出现的情况:

  1. inf一般是因为得到的数值,超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值);

  2. 而nan一般是因为对浮点数进行了未定义的操作,如对-1开方。

  3. 除以0

  4. sizeWithFont的字符串为nil

  5. 数学函数不正确运算

举个例子:

  1. 1.0/0.0等于inf,-1.0/0.0等于-inf,0.0+inf=inf;
  2. 对负数开方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)

解决方法:

  1. 找到调用参数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;

    }

你可能感兴趣的:(计算值时为Nan / inf)