iOS Nan or +inf
2765 ワード
クラッシュログ
NaNをjson変換して崩壊させた
NaNと+infとは
nan:not a numberは数字infではありません:infinity無限infは一般的に得られた数値のため、浮動小数点数の表現範囲(オーバーフロー、すなわち、階層コード部分がその表すことができる最大値を超える)を超えています.nanは一般的に浮動小数点数に対して未定義の操作を行ったため、例えば-1開方
プロジェクトのクラッシュを引き起こすコード
10と0はバックグラウンドからデータが返され、算出されたvideoLength=NaN
OCはいつこの2つの状況が発生しますか? num/0分母はゼロ 対負数開二乗 数学関数不正確演算 1/0の可能性のある値
結果はすべて0
各種タイプ変数/0または変数/0.0
変数/変数2番目の変数は0または0.0です.
//NSData *json1 = [NSJSONSerialization dataWithJSONObject:@{@"key":@(inf)} options:NSJSONWritingPrettyPrinted error:nil];
NaNが発生した場合
結論
浮動小数点数タイプを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 と判断する.判定データ
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つの状況が発生しますか?
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は直接クラッシュを引き起こすわけではないが,後期演算でクラッシュを引き起こす可能性がある.
解決策
if (isnan(a)) {
NSLog(@"NaN");
}
if (isinf(b)) {
NSLog(@"+inf");
}