inf和nan含義如下:
INF表示“無窮大”,是infinite的縮寫。NAN表示“無效數(shù)字”,是Not a number的縮寫。
2.inf是不會(huì)崩潰的,但nan是會(huì)崩潰的
本人出現(xiàn)的情況:
仔細(xì)研究后發(fā)現(xiàn),原來是我獲取的 UIImage 對(duì)象 等于 nil 了,以至于 image.size.height 值 和 image.size.width 的值,都拿不到了;
那么image的寬高比 計(jì)算出來的 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;
//這種情況就比較特殊了,因?yàn)閺暮笈_(tái)那里拿到的image為nil,導(dǎo)致高度計(jì)算不合法,并且image需重新實(shí)例出來才有
if (isnan(imgHeight)){
UIImage *image = [UIImage imageNamed:@"defaultImage"];
weakCell.photo.image = image;
imgHeight = ScreenWidth;
}
延伸:
出現(xiàn)的情況:
inf一般是因?yàn)榈玫降臄?shù)值,超出浮點(diǎn)數(shù)的表示范圍(溢出,即階碼部分超過其能表示的最大值);
而nan一般是因?yàn)閷?duì)浮點(diǎn)數(shù)進(jìn)行了未定義的操作,如對(duì)-1開方。
除以0
sizeWithFont的字符串為nil
數(shù)學(xué)函數(shù)不正確運(yùn)算
舉個(gè)例子:
1.0/0.0等于inf,-1.0/0.0等于-inf,0.0+inf=inf;對(duì)負(fù)數(shù)開方sqrt(-1.0)、對(duì)負(fù)數(shù)求對(duì)數(shù)(log(-1.0))、0.0/0.0、0.0*inf、inf/inf、inf-inf這些操作都會(huì)得到nan。(0/0會(huì)產(chǎn)生操作異常;0.0/0.0不會(huì)產(chǎn)生操作異常,而是會(huì)得到nan)
解決方法:
- 找到調(diào)用參數(shù)nan或者inf 的語句加入邏輯判斷(運(yùn)用math類里的isnan):
if (!isnan(CGRectGetMidX(newFrame))) 就是當(dāng)CGRectGetMidX不為無效參數(shù)調(diào)用此句.這樣就可以解決崩潰了
2.( 得到inf時(shí)就查看是否有溢出或者除以0,得到nan時(shí)就查看是否有非法操作。)
nan==nan 結(jié)果是0或false,即不能和nan進(jìn)行比較,和nan進(jìn)行比較得到的結(jié)果總是false或0。所以可以用函數(shù): int isNumber(double d){return (d==d);}來判斷d是否為nan,若d是nan則返回0,否則返回非零值
float ecg;
if(isnan(ecg)){ //isnan為系統(tǒng)函數(shù)
//you code
ecg = 0.0;
}
else {
//you code
}
//inf同理
if (isinf(height)) {
height=0.0f;
}