o 6a]@sZddlZddlZddlZddlmZmZmZmZddlm Z m Z ddZ GdddZ dS)N)uint16float16float32float64)assert_ assert_equalc Oshz ||i|Wn!ty*}ztt||dkd|WYd}~dSd}~wwtdd|dS)Nrz%Did not raise floating point %s errorF)FloatingPointErrorrstrfind)strmatchcallableargskwargsexcr max_pattern f16s_patterns f16s_float res_patterns cmp_patterns shift_patternrrrtest_half_conversion_roundingUs.&&  $z&TestHalf.test_half_conversion_rounding)rBuint_tbits4c Cstdtj|}|dksJ||d}|tjdks"Jt|D]}|||d|>B}||}|tj|ksBJq&dS)Nrp>rDr)rrr(rr8range) r&rBrQrRsmallest_valuerounded_to_zeroilarger_pattern larger_valuerrr(test_half_conversion_denormal_round_evens    z1TestHalf.test_half_conversion_denormal_round_evencCstjddtt|jt|jtt|jt|jtt|jt|jtt|jt|jtt t dtj t tj }t |j|k t ||jk t |j|kt ||jkt |j|k t ||jk t |j|k t ||jk t |j|k t ||jk t |j|k t ||jk WddS1swYdS)Nignoreall)rerrstaterisnanrrisinfisfinitesignbitspacingrinfnanranyr_)r&rhrrrtest_nans_infss( "zTestHalf.test_nans_infscCsVtddddddddd d d d d dtjtj g}tjgdtd}t|_t||dS)z,Confirms a small number of known half values?@gg?T?r` ?rUgprg)i<ii@iif.iU5i{iirir|rrN)rrrgrrrrr&ar+rrrtest_half_valuess  zTestHalf.test_half_valuescCsjtjgdtd}dddddddtjg}tj|td}t||tj|td}tj|td}t||dS) z7Checks that rounding when converting to half is correct)g`>g`>gP>g?g?g?iirrUgg?rkr`N)rrrrgrrr)r&rvroundedr+rrrtest_half_roundings"   zTestHalf.test_half_roundingc Cs|jjtd}d|d@d?}tj|d@d?tjdd}|d@d}||d kd 7<d ||d k<||d |}t|j|kd }t|d krc|d }t |j|d|j||j|||ft|j |kd }t|d kr|d }t |j |d|j||j |||fdSdS)z_Take every finite float16, and check the casting functions with a manual conversion.rrlrsrt igP?irirmrz,First non-equal is half value %x -> %g != %gN) r#r(rrrint32nonzeror$lenrr%) r&a_bitsa_sgna_expa_mana_manuala32_fail bad_indexa64_failrrrtest_half_correctnesss<    zTestHalf.test_half_correctnesscCs$|jddd}tj|td}||t||t|dd|ddkt|dd|ddk t|dd|ddkt|dd|ddk tt |dd|ddkdj |j dtt |dd|ddkdj |j ddS)z'Make sure comparisons are working rightNrrrrrD) r rHrrrsortrrr_rir}sizerurrrtest_half_orderings  " "04zTestHalf.test_half_orderingc CsZttjdtdtjdtdtjdtd}|dt|tjdtdtjgdtd}t| dgd| }t| dgdtjdddtd}tjd td}tt ||d tjdtj d dd d ddgtd}t|dtjdtj d tj d tjddgtd}t|dtjdtd}tdD] }t|||qdS)zTest the various ArrFuncsr{r)r)rrrg#B ǻrrUgT>r)rDrrC)_g)@g333333@g@g(@rN)rrrrrzerosfillr7rr}byteswap newbyteorderdotrgargmaxrhrVitem)r&rvr+rYrrrtest_half_funcs/s>      "& zTestHalf.test_half_funcscCstjdtd}tjtjftd}tjtjftd}|jtd}tt |dd|dd|ddtt |dd||ddtt |d| |d tt |dd| |ddtt |||dtt | ||d tt |||tt || |dtt | ||d tt | | | tt |||dtt |||dtt |||tt |||tt ||||dO}tt |dt |dtt |dd|dd|ddtt |d||d tt |dd||ddtt |dd| |ddtt |||d tt | ||dtt |||dtt |||ddS)z Test np.spacing and np.nextafterrtrNrrrrs) rrrrrgrrhr(rrfrG)r&rvhinfhnana_f16rrrtest_spacing_nextafterVs: ,"$,"$zTestHalf.test_spacing_nextaftercCstjgdtd}tjgdtd}tjddtj tjdgtd}tt||gdtt||gdtt||gd tt ||gd tt ||gd tt ||gd tt ||gd tt ||gdtt||gdtt||gdtt||gdtt||gdtt||gdtt|gdtt|gd tt|gdtt|gdtt|gdtt||gdtt||gdt||}tt|dd|d<t|gdtt||gdt||}tt|dd|d<t|ddtj ddgtt||gdtt||gdtt||gdtt||ddtj ddgtt||gdtt||gdtt ||gdgdftt!|gd tt"|gd!tt#|gd"tt$||tt%|gdtt&|gd#tt'||tt(|gd$tt)|gd%|ftt*|gd&gd'ftt+|gdgd(d)S)*zTest the various ufuncs)rrrDrrDr)rrrrr5rrr)rrr5r)rDrrr)rrrDr)r?rDrgT?)FFFTF)TTTFT)FTFFT)FTFTT)TFTFF)TFTTF)FTTTT)TTTTT)TFFFF)FFTFF)TTFFT)rDrrrr5)rrrDrr5r5)rrrrr)rrrrrDr)rrrrrr)rrrDrr)rrrrrD)rrr )rrg?rn)rrrrr)rDrr)rrrrr)rrrrr)rg?rCrCg?)rDr5rr5rD)rr{r@ N),rrrrgrhraddsubtractmultiplydivideequal not_equalless less_equalgreater greater_equal logical_and logical_or logical_xor logical_notrbrcrdrecopysignmaximumrminimumfmaxfmin floor_divide remainderdivmodsquare reciprocal ones_like conjugateabsolutenegativepositivesignmodffrexpldexp)r&rvr+cxrrrtest_half_ufuncssd   zTestHalf.test_half_ufuncscCsptjdtd}tjdtd}td}td}tt|djttt|djttt||jttt||jttt||jttt||jttt|djttt|djttt||jttt||jttt||jttt||jttt||jttt||jttt||jttt||jtdS)z9Test that half gets coerced properly with the other typesrrrrDrmN)rrrrrpowerrr)r&a16a32b16b32rrrtest_half_coercions(zTestHalf.test_half_coercionarmv5telz See gh-413.)reasoncCstjddtjdtd}tjdtd}td}td}tdd d ||tdd d ||tdd d ||tdd d ||tddd ||tddd ||tddd ||tddd ||tddd tdtdtddd tdtdtddd tdtdtddd tdtdtddd tdtdtdd d ||tdd!d ||tdd"d ||tdd#d ||tdd$d ||tdd%d ||tdd&d ||tdd'd ||tdd(d td)td*tdd+d td,td*tdtjtd)ttjtdtjtd,ttj tdtjtd)td-tjttjttjtd-tjttjtd-tjttj td.td/td0tdtdtd1ttd,ttd)ttj ttd,ttjtttjtd2tttj td2ttd2ttj tttj td2tdtd1tdtd1tdtdtd3tdWddS1swYdS)4Nraiser^)-C6?r)@rr underflowcS||SNrrvr+rrrz(TestHalf.test_half_fpe..cSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcS||SrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrrpicSrrrrrrrrrrqcSrrrrrrrrrg?rDcSrrrrrrrrrgcSrrrrrrrrrg?roverflowcSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcSrrrrrrrrrcSs||Srrrrrrrrr`cSs||Srrrrrrrrroinvalidi g ?rrrg) rrarrrrGrgrfrrh)r&sx16bx16sy16by16rrr test_half_fpes~              $zTestHalf.test_half_fpecCsPGddd}tjdtd}|}|j|_t|}t|jtkt||dS)z5Test that half is compatible with __array_interface__c@s eZdZdS)z1TestHalf.test_half_array_interface..DummyN)__name__ __module__ __qualname__rrrrDummy"srrrN)rr7r__array_interface__rrrr)r&rrvr+rrrrtest_half_array_interface s z"TestHalf.test_half_array_interfaceN)rrrr'r0pytestmark parametrizer;r=rrrrPuint32uint64r\rjrwryrrrrrrskipifplatformmachinerrrrrrrs>   5   $'-@  Ar) rrnumpyrrrrr numpy.testingrrrrrrrrs