【python】nanの判断方法

10184 ワード

pythonのnanは独自のタイプだと思っていたのですが、JS、C++ともにこのタイプがあり、怪しげに書かれたコードバグが少なすぎて遭遇しませんでした
Noneとnan
type(None)-----------Nonetype type(Nan)-------------float
判断nan
ここでは7つの判断方法を示したが、実際に有効なのは3つだけで、まだ半有効~後の4つの方法はnpのみである.nanは自分のタイプを判断することができて、その他の3種類は自分で自分を判断することができません.つまりnp.nan is np.nanはTrue float(‘nan’)is float(‘nan’)はFalseで、他の2つもFalseなのはなぜですか?Nan全称はNot a Numberであり、IEEE 754規格で規定されている二重精度浮動小数点数型の特殊値である.だからdのタイプを見て、np.nan、戻りもfloatタイプです.
import pandas as pd
import numpy as np
import math
from decimal import Decimal
'''    ,       '''
'''        Decimal   '''
def isNan_1(a):
    return math.isnan(a)
def isNan_2(a):
    return a != a
def isNan_3(a):
    if(str(a) == 'nan'):
        return True
    else:
        return False
def isNan_4(a):
    return a is float('nan')
def isNan_5(a):
    return a is Decimal('nan')
def isNan_6(a):
    return a is np.nan
def isNan_7(a):
    return a is np.float64('nan')

4種類のfloat(‘nan’)npを試みた.float64(‘nan’) Decimal(‘nan’) np.nanは結果から、最初の2つの関数は100%正しいが、3つ目はfloatとnpであることが分かった.nanは効果があり、精度の高いDecimalには無効です.私もたまたまこの方法を見つけただけです.
a = float('nan')
type_str = "float('nan')"
print("%s type is \t \t \t \t %s
"
%(type_str, type(a))) print("math.isnan(%s) \t \t %s
"
%(type_str, isNan_1(a))) print("%s != %s \t \t %s
"
%(type_str, type_str, isNan_2(a))) print("%s == 'nan' \t \t \t %s
"
%(type_str,isNan_3(a))) print("%s is float('nan') \t \t %s
"
%(type_str,isNan_4(a))) print("%s is Decimal('nan') \t \t %s
"
%(type_str,isNan_5(a))) print("%s is np.nan \t \t \t %s
"
%(type_str,isNan_6(a))) print("%s is np.float64('nan') \t %s
"
%(type_str,isNan_7(a)))
float('nan') type is 	 	      	 

math.isnan(float('nan'))  	    	 True

float('nan') != float('nan') 	 	 True

float('nan') == 'nan' 	 	    	 True

float('nan') is float('nan')  	 	 False

float('nan') is Decimal('nan') 	 	 False

float('nan') is np.nan 	 	    	 False

float('nan') is np.float64('nan')  	 False
np.float64('nan')  type is 	      	 

math.isnan(np.float64('nan'))  	     	 	 True

np.float64('nan') != np.float64('nan') 	 	 True

np.float64('nan') == 'nan' 	 	        	 True

np.float64('nan') is float('nan')  	 	 	 False

np.float64('nan') is Decimal('nan') 	 	 False

np.float64('nan') is np.nan 	    	 	 False

np.float64('nan') is np.float64('nan')  	 False
Decimal('nan')  type is	 	 	 	 

math.isnan(Decimal('nan'))  	 		  	 True

Decimal('nan') != Decimal('nan') 	 	 	 True

Decimal('nan') == 'nan' 	 	 		  	 False

Decimal('nan') is float('nan')  	 	     False

Decimal('nan') is Decimal('nan') 	 	     False

Decimal('nan') is np.nan 	 	 		  	 False

Decimal('nan') is np.float64('nan')  	 	 False
np.nan type is 	 	    	 

math.isnan(np.nan)  	 	 	 True

np.nan != np.nan 		 	  	 True

np.nan == 'nan' 	 	 	 	 True

np.nan is float('nan')  	 	 False

np.nan is Decimal('nan') 	 	 False

np.nan is np.nan 	 		  	 True

np.nan is np.float64('nan')  	 False