計(jì)算值時(shí)為Nan / inf

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)的情況:

  1. inf一般是因?yàn)榈玫降臄?shù)值,超出浮點(diǎn)數(shù)的表示范圍(溢出,即階碼部分超過其能表示的最大值);

  2. 而nan一般是因?yàn)閷?duì)浮點(diǎn)數(shù)進(jìn)行了未定義的操作,如對(duì)-1開方。

  3. 除以0

  4. sizeWithFont的字符串為nil

  5. 數(shù)學(xué)函數(shù)不正確運(yùn)算

舉個(gè)例子:

  1. 1.0/0.0等于inf,-1.0/0.0等于-inf,0.0+inf=inf;
  2. 對(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)

解決方法:

  1. 找到調(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;

    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是 JavaScript 語言? JavaScript 是一種輕量級(jí)的腳本語言。所謂“腳本語言”(script...
    oWSQo閱讀 1,915評(píng)論 0 1
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 1,392評(píng)論 0 15
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,679評(píng)論 0 4
  • As we all konwn, it's easy to develop C++ project on linu...
    龍河閱讀 458評(píng)論 1 0
  • 原文鏈接 不管是應(yīng)用秒變幻燈片,還是啟動(dòng)過久被殺,基本都是開發(fā)者必經(jīng)的體驗(yàn)。就像沒人希望堵車一樣,卡頓永遠(yuǎn)是不受用...
    sindri的小巢閱讀 16,253評(píng)論 15 152

友情鏈接更多精彩內(nèi)容