iOS Nan or +inf

2765 ワード

クラッシュログ
Invalid number value (NaN) in JSON write-[NSDictionary(JSON)GZ_ toJsonString]

NaNをjson変換して崩壊させた
NaNと+infとは
nan:not a numberは数字infではありません:infinity無限infは一般的に得られた数値のため、浮動小数点数の表現範囲(オーバーフロー、すなわち、階層コード部分がその表すことができる最大値を超える)を超えています.nanは一般的に浮動小数点数に対して未定義の操作を行ったため、例えば-1開方
プロジェクトのクラッシュを引き起こすコード
 CMTime time = CMTimeMake(10, 0);
 CGFloat videoLength = round(time.value*1.0/time.timescale);

10と0はバックグラウンドからデータが返され、算出されたvideoLength=NaN
OCはいつこの2つの状況が発生しますか?
  • num/0分母はゼロ
  • 対負数開二乗
  • 数学関数不正確演算
  • 1/0の可能性のある値
        int i1 = 1/0;
        NSInteger n1 = 1/0;
        CGFloat cf1 = 1/0;
        double d1 = 1/0;
        float f1 = 1/0;
    

    結果はすべて0
    各種タイプ変数/0または変数/0.0
        int ia = 1;
        NSInteger na = 1;
        CGFloat cfa = 1.0;
        double da = 1.0;
        float fa = 1.0;
        
        int ria = ia/0;         //-374309760
        NSInteger rna = na/0;   //0
        CGFloat rcfa = cfa/0;   //+inf
        double rda = da/0;      //+inf
        float rfa = fa/0;       //+inf
    
        rcfa = cfa/0.0;         //+inf
        rda = da/0.0;           //+inf
        rfa = fa/0.0;           //+inf
    
        int ria1 = ia/0;        //0
        int rna1 = na/0;        //32671
        int rcfa1 = cfa/0;      //-2147483648
        int rda1 = da/0;        //-2147483648
        int rfa1 = fa/0;        //-2147483648
    

    変数/変数2番目の変数は0または0.0です.
       int ia = 1;
      NSInteger na = 1;
      CGFloat cfa = 1.0;
      double da = 1.0;
      float fa = 1.0;
      int zi = 0;
      double zd = 0.0;
      
      int ria2 = ia/zi;           //crash: Thread 1: EXC_ARITHMETIC (code=EXC_I386_DIV, subcode=0x0)
      NSInteger rna2 = na/zi;     //crash: Thread 1: EXC_ARITHMETIC (code=EXC_I386_DIV, subcode=0x0)
      CGFloat rcfa2 = cfa/zi;     //+inf
      double rda2 = da/zi;        //+inf
      float rfa2 = fa/zi;         //+inf
    
      int ria3 = ia/zd;           //-2147483648
      NSInteger rna3 = na/zd;     //-9223372036854775808
      CGFloat rcfa3= cfa/zd;      //+inf
      double rda3 = da/zd;        //+inf
      float rfa3 = fa/zd;         //+inf
    

    //NSData *json1 = [NSJSONSerialization dataWithJSONObject:@{@"key":@(inf)} options:NSJSONWritingPrettyPrinted error:nil];
    NaNが発生した場合
    CMTime time = CMTimeMake(10, 0);
    CGFloat videoLength = round(time.value*1.0/time.timescale);
    

    結論
    浮動小数点数タイプを0で割って+infを生成し、この値@{@"key":@(+inf)}をjson処理してもクラッシュします.変数/変数(0)がクラッシュするcrash:Thread 1:EXC_ARITHMETIC(code=EXC_I 386_DIV、subcode=0 x 0)変数/変数(0.0)はクラッシュせず、乱数が発生します.NaNまたは+infは直接クラッシュを引き起こすわけではないが,後期演算でクラッシュを引き起こす可能性がある.
    解決策
  • 数学計算の場合、分母を0
  • と判断する.
  • 判定データ
  • if (isnan(a)) {
           NSLog(@"NaN");
       }
       
       if (isinf(b)) {
           NSLog(@"+inf");
       }